leetcode65 valid number 解題報告
阿新 • • 發佈:2018-12-12
leetcode 65 valid number 解題報告
這道題目實際上很簡單,至少我一眼看上去是這樣子的,完全和它Hard的難度不相符合。然而這個踩的數量居然高達2k,這讓我十分好奇。實際做起來……我認為出題人預設做題者知道兩件事情:
.
的前後可以只有一個數字- 0是可以省略的
單看這兩條沒有什麼問題,但是題目自動省略瞭如下的樣例:
- ”-.8“ true
- “3.” true
- “.1” true
- “+0e-” false
- “46.e3” true
實際解法的話使用的是有限狀態機,為了簡單起見寫的不是很符合標準。
- 狀態0:開始狀態,接受先導空格進入狀態1.
- 狀態1:先導空格狀態。接受[0-9]進入整數狀態3,接受-/+進入狀態2,接受
.
- 狀態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;
}