题目描述:
有效数字(按顺序)可以分成以下几个部分:
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
部分有效数字列举如下:
["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:
["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
题源:https://leetcode-cn.com/problems/valid-number/
题解:全靠细节
string取一小截,可以用string.substr(起始位置,长度)
class Solution { public: bool isint(string s) { int l=s.size(); int i=0; if (s[i]=='+' || s[i]=='-') i++; int num=0; //需要考虑的细节,就是至少是有一个数字的 for(;i<l;i++) if (s[i]>='0' && s[i]<='9') {num++; continue;} else return false; if(num>0) return true; else return false; } bool isfloat(string s) { int l=s.size(); int flagdot=0; int posdot=-1; int i=0; if (s[i]=='+' || s[i]=='-') i++; for(int j=i;j<l;j++) if(s[j]=='.') { flagdot++; posdot=j;} if (flagdot!=1) return false; int num=0; //需要考虑的细节,就是至少是有一个数字的 for(;i<posdot;i++) if(s[i]>='0' && s[i]<='9') {num++; continue;} else return false; for(i=posdot+1;i<l;i++) if(s[i]>='0' && s[i]<='9') {num++; continue;} else return false; if (num>0) return true; else return false; } bool isNumber(string s) { int l=s.size(); int flagE=0; int posE=-1; for(int i=0;i<l;i++) if (s[i]=='E' || s[i]=='e') {flagE++; posE=i;} if (flagE>1) return false; bool res=1; if (flagE==1) { if( isint(s.substr(posE+1,l-posE)) && ( isint(s.substr(0,posE-0)) || isfloat(s.substr(0,posE-0)) ) ) return true; else return false; } else { if ( isint(s.substr(0,posE-0)) || isfloat(s.substr(0,posE-0)) ) return true; else return false; } } };