1. 程式人生 > >leetcode65 valid number 解題報告

leetcode65 valid number 解題報告

leetcode 65 valid number 解題報告

這道題目實際上很簡單,至少我一眼看上去是這樣子的,完全和它Hard的難度不相符合。然而這個踩的數量居然高達2k,這讓我十分好奇。實際做起來……我認為出題人預設做題者知道兩件事情:

  1. .的前後可以只有一個數字
  2. 0是可以省略的

單看這兩條沒有什麼問題,但是題目自動省略瞭如下的樣例:

  • ”-.8“ true
  • “3.” true
  • “.1” true
  • “+0e-” false
  • “46.e3” true

實際解法的話使用的是有限狀態機,為了簡單起見寫的不是很符合標準。

  • 狀態0:開始狀態,接受先導空格進入狀態1.
  • 狀態1:先導空格狀態。接受[0-9]進入整數狀態3,接受-/+進入狀態2,接受.
    進入狀態12.
  • 狀態2:接受[0-9]進入狀態3,接受.進入狀態12
  • 狀態12:為了處理小數點前後的省略問題引入的狀態,接受[0-9]進入狀態5
  • 狀態3:接受[0-9]進入狀態3,接受.進入狀態4,接受e進入狀態6
  • 狀態4:與狀態12類似,接受e進入狀態6,接受[0-9]進入狀態5
  • 狀態5:接受[0-9]進入狀態5,接受e進入狀態6
  • 狀態6:接受[0-9]進入狀態8,接受+/-進入狀態7
  • 狀態7:接受[0-9]進入狀態8

狀態3、狀態5、狀態8自動通向目標狀態,同時這三個狀態如果接受到空格則轉到狀態10. 對於狀態10,接受到空格則轉到狀態10,不然轉到狀態11. 其他不符合的輸入都會轉到狀態11,狀態11是死狀態。

實現這個有限狀態機即可,程式碼如下:

#include <string>
#include <iostream>
using namespace std;

class Solution {
public:
    bool isNumber(string s) {
        unsigned int i = 0;
        int state = 0;
        while(i<s.length())
        {
            //cout<<state<<endl;
            switch(state)
{ case 0:{ if(s[i]==' ') { i++; } else { state = 1; } break; } case 1:{ if(judgeNumber(s[i])) { state = 3; } else if(s[i]=='+' || s[i]=='-') { i++; state = 2; } else if(s[i]=='.') { i++; state = 12; } else { state = 11; } break; } case 2:{ if(judgeNumber(s[i])) { state = 3; } else if(s[i]=='.') { state = 12; i++; } else { state = 11; } break; } case 3:{ if(judgeNumber(s[i])) { i++; } else if(s[i]=='e') { i++; state = 6; } else if(s[i]=='.') { i++; state = 4; } else if(s[i]==' ') { state = 10; } else { state = 11; } break; } case 4:{ if(judgeNumber(s[i])) { state = 5; } else if(s[i]=='e') { i++; state = 6; } else if(s[i]==' ') { state = 10; } else { state = 11; } break; } case 5:{ if(judgeNumber(s[i])) { i++; } else if(s[i]=='e') { i++; state = 6; } else if(s[i]==' ') { state = 10; } else { state = 11; } break; } case 6:{ if(judgeNumber(s[i])) { state = 8; } else if(s[i]=='-'||s[i]=='+') { i++; state = 7; } else { state = 11; } break; } case 7:{ if(judgeNumber(s[i])) { state = 8; } else{ state = 11; } break; } case 8:{ if(judgeNumber(s[i])) { i++; } else if(s[i]==' ') { state = 10; } else { state = 11; } break; } case 10:{ if(s[i]==' ') { i++; } else { state = 11; } break; } case 12:{ if(judgeNumber(s[i])) { state = 5; } else { state = 11; } break; } } if(state == 11)//dead state { break; } } if(state == 3||state==4||state == 5 ||state == 8 || state == 9 || state == 10) { return true; } else return false; } bool judgeNumber(char c) { return c-'0'>=0&&c-'0'<=9; } }; int main(void) { Solution s; string str = "4e+"; cout<<s.isNumber(str)<<endl; return 0; }