题目链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/
题意:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
方法一: 利用状态机,总共14个状态
class Solution {
public:
bool isNumber(string s) {
// 利用状态机
int state = 0;//表示状态,初始状态为0
for(char& ch:s)//枚举每一个字符
{
switch(state){
case 0://初始状态,
if(ch==' ') state = 1;//输入空格前往状态1
else if(ch=='+'||ch=='-') state = 2;//输入正负号前往状态2
else if(ch>='0'&&ch<='9') state = 3;//输入0到9前往状态3
else if(ch=='.') state = 10;//输入小数点,前往状态10
else return false;//出现了其它输入,判错
break;
case 1:
if(ch==' ') state = 1;//输入空格保持原样
else if(ch=='+'||ch=='-') state = 2;//输入正负号前往状态2
else if(ch>='0'&&ch<='9') state = 3;//输入0到9前往状态3
else if(ch=='.') state = 10;//输入小数点,前往状态10
else return false;//出现了其它输入,判错
break;
case 2:
if(ch>='0'&&ch<='9') state = 3;//输入0到9前往状态3
else if(ch=='.') state = 10;//输入小数点,前往状态10
else return false;//出现了其它输入,判错
break;
case 3:
if(ch>='0'&&ch<='9') state = 3;//输入0到9保持原样
else if(ch=='.') state = 4;//输入小数点前往状态4
else if(ch=='e'||ch=='E') state = 6;//输入E,前往状态6
else if(ch==' ') state = 9;//输入空格前往状态9
else return false;//出现了其它输入,判错
break;
case 4:
if(ch>='0'&&ch<='9') state = 5;//输入0到9前往状态5
else if(ch=='e'||ch=='E') state = 6;//输入E,前往状态6
else if(ch==' ') state = 9;//输入空格,前往状态9
else return false;//出现其他输入,判错
break;
case 5:
if(ch>='0'&&ch<='9') state = 5;//输入0到9保持原样
else if(ch=='e'||ch=='E') state = 6;//输入E,前往状态6
else if(ch==' ') state = 9;//输入空格前往状态9
else return false;//出现其他输入,判错
break;
case 6:
if(ch>='0'&&ch<='9') state = 7;//输入0到9前往状态7
else if(ch=='+'||ch=='-') state = 8;//输入正负号前往状态8
else return false;//出现其他输入,判错
break;
case 7:
if(ch>='0'&&ch<='9') state = 7;//输入0到9保持原样
else if(ch==' ') state = 9;//输入空格前往状态9
else return false;//出现其他输入,判错
break;
case 8:
if(ch>='0'&&ch<='9') state = 7;//输入0到9前往状态7
else return false;//出现其他输入,判错
break;
case 9:
if(ch==' ') state = 9;//输入空格保持原样
else return false;//出现其他输入,判错
break;
case 10:
if(ch>='0'&&ch<='9') state = 11;//输入0到9前往状态11
// else if(ch=='e'||ch=='E') state = 15;//输入E,前往状态15
else return false;//出现其他输入,判错
break;
case 11:
if(ch>='0'&&ch<='9') state = 11;//输入0到9保持原样
else if(ch==' ') state = 9;//输入空格前往状态9
else if(ch=='e'||ch=='E') state = 12;//输入E,前往状态12
else return false;//出现其他输入,判错
break;
case 12:
if(ch>='0'&&ch<='9') state = 13;//输入0到9前往状态13
else if(ch=='+'||ch=='-') state = 13;//输入正负号前往状态13
else return false;//出现其他输入,判错
break;
case 13:
if(ch>='0'&&ch<='9') state = 13;//输入0到9保持不变
else if(ch==' ') state = 14;//输入空格前往状态14
else return false;//出现其他输入,判错
break;
case 14:
if(ch==' ') state = 14;//输入空格保持不变
else return false;//出现其他输入,判错
break;
default:
break;
}
}
if(state==3||state==4||state==5||state==7||state==9||state==11||state==13||state==14) return true;//假如最后的状态是3,说明结尾是一个数字,假如最后的状态是4,说明是一个小数点,假如最后的状态是5,说明结尾是个数字,并且是小数,假如最后的状态为7,就说明是E后面跟了整数,假如最后状态为9,就说明结尾是空格,假如最后状态为11说明是“.数字”的格式
return false;//否则说明不是
}
};
方法二:朴实的判断,简简单单的幸福,方法一写完已经泪目了,
class Solution {
public:
int integer(string& s, int n) {
while (s[n] != '\0') {
if (s[n] < '0' || s[n] > '9') break;
n ++;
}
// n指向下一个
return n;
}
int integerAOrDecimal(string& s, int n){
int n_orig1 = n;
n = integer(s, n);
int n_vary1 = n;
// 判断是否是整数
if (s[n] != '.'){
return n_vary1 == n_orig1 ? -1 : n_vary1;
}
// 判断是否是小数
// 跨过小数点
n ++;
int n_orig2 = n;
n = integer(s, n);
int n_vary2 = n;
if (n_orig1 == n_vary1 && n_orig2 == n_vary2) return -1;
return n_vary2;
}
bool isNumber(string s) {
int n = 0;
// 处理前面的若干空格
while (s[n] == ' ') n ++;
// 跨过正负号
if (s[n] == '+' || s[n] == '-') n ++;
// 判断小数或者整数
n = integerAOrDecimal(s, n);
if (n == -1) return false;
// 可选是不是存在e\E
if (s[n] == 'e' || s[n] == 'E') {
n ++;
if (s[n] == '+' || s[n] == '-') n ++;
int n_orig = n;
n = integer(s, n);
if (n_orig == n) return false;
}
// 判断结尾空格
while (s[n] != '\0') {
if (s[n] != ' ') return false;
n ++;
}
return true;
}
};
方法三:偷懒的话直接用python,没有难度
class Solution(object):
def isNumber(self, s):
"""
:type s: str
:rtype: bool
"""
try:
float(s)
except:
return False
return True