题目:
解答:
判定是否数字是合法数字,主要是区分几点
- 数字前后可以有空格,中间不可以有空格
- 符号
+/-
只可以存在数字之前 - 数字如果不包含科学计数法
e
,则只可以存在一个+ - .
符号 - 不允许只有
+ - . e
符号没有数字 - 科学计数法
e
后面的数字可以有+/-
符号,不可以有小数点 - 科学计数法前后必须包含数字
- 去除空格后为空串,不合法
这样设定几个标记位,然后遍历字符串,即可判定出来。
代码:
class Solution {
public:
bool isNumber(string s) {
// 经过测试,要求是:
// 1. 纯数字类型,0-9,小数点,+/-符号
// 2. 科学计数法 e后面必须跟数字
// 3. 数字之间不允许空格、两端允许空格
int len = s.size();
int index1 = 0, index2 = len - 1;
while(index1 < len && s[index1] == ' ') ++index1;
if(index1 == len) return false;
while(s[index2] == ' ') --index2;
bool getSign = false, getSci = false, getPoint = false, getNum = false, getNumAfterSci = false;
for(int i = index1;i <= index2; ++i){
switch(s[i]){
case '+':case '-':
if(getSign || getNum || getPoint) return false;
getSign = true;
break;
case 'e':
if(getSci || !getNum) return false;
getSci = true;
getSign = false; //重新计算sign存在
getNum = false;
getPoint = false;
break;
case '.':
if(getPoint || getSci) return false;
getPoint = true;
break;
case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':
if(getSci)
getNumAfterSci = true;
getNum = true;
break;
default:
return false;
}
}
if(getSci && !getNumAfterSci) return false;
if((getSign || getPoint || getSci) && !getNum) return false;
return true;
}
};
更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)