表示数值的字符串
1.个人觉得牛客网这个答案比较容易理解
思路:用for循环遍历: 判断各种会出错的情况 报false;如果能过五关斩六将走到最后,那么就是true
注意判断顺序!!
1)e后面应该接数字 (如果e是最后一个数,报错)
2)不能同时存在两个e
3)+ - 所在的位置,只可可能位于首位或者位于e后面;
4)e后面不可以有小数点 小数点只可能有一次 不可能出现2次
5)如果字符其他数字的部分,有出现<'0' 或者 >'9',那么是无效的;
class Solution { public: bool isNumeric(char* str) { // 标记符号、小数点、e是否出现过 bool sign = false, decimal = false, hasE = false; for (int i = 0; i < strlen(str); i++) { if (str[i] == 'e' || str[i] == 'E') { if (i == strlen(str)-1) return false; // e后面一定要接数字 if (hasE) return false; // 不能同时存在两个e hasE = true; } else if (str[i] == '+' || str[i] == '-') { // 第二次出现+-符号,则必须紧接在e之后 if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false; // 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后 if (!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') return false; sign = true; } else if (str[i] == '.') { // e后面不能接小数点,小数点不能出现两次 if (hasE || decimal) return false; decimal = true; } else if (str[i] < '0' || str[i] > '9') // 不合法字符 return false; } return true; } };
class Solution { public: bool isNumeric(char* string) { // 标记符号、小数点、e是否出现过 bool sign=false,decimal=false,hasE=false; //默认没出现 for(int i=0;i<strlen(string);i++)//遍历; { //判断e后应接数字 不能存在两个e if(string[i]=='e'||string[i]=='E') { if(i==strlen(string)-1) //最后一位‘ return false; //直接返回错误 if(hasE)//第一次进肯定是false 不会进 //下一次再进来证明有两个e 保错 return false; hasE=true; } else if(string[i]=='-'||string[i]=='+') { // 第二次出现+-符号,则必须紧接在e之后 if(sign&&string[i-1]!='e'&&string[i-1]!='E')//sign=true 已经存在了 return false; //首次出现符号 既不在开头,它前面也无e if(!sign&&i>0&&string[i-1]!='e'&&string[i-1]!='E') return false; sign=true; //if条件进来了他就有符号 } else if(string[i]=='.') { if (hasE||decimal)//小数点出现两次 //这里不太懂 为什么有e //懂了 说明这里的遍历已经在e之后了 return false; decimal=true; } else if(string[i]<'0'||string[i]>'9')//非法输入 { return false; } } return true; //没有任何问题 走到最后一步 } };