题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
分析
先吐槽一句,这题的题面说的啥啊
总体思路:
根据题目的意思,可以把字符串根据e(小写)分为两部分,底数和指数部分.
底数部分:
1.可以使用一次’.’,剩下的都是数字.(除了第一个的’+’/’-’)
2.小数点左右不能都没有东西.
3.必须要有数字 不能出现 ‘+e1 ’ 这种.
指数部分:(简化版的底数)
1.不能使用. 都是数字.(除了第一个的’+’/’-’)
2.必须要有数字,不能出现’+1e+’ 这种.
我在不断的试错,疯狂打补丁,补了五次,有的是因为题面不清楚,有的是自己没考虑到的
-
‘.’ 这种是 小数点左右没有东西 使用
if(flag==st&&flag==s.length()-1) return false;
来判断左右都没有(“1.“和”.1” 这两种是应该过的.题目没有描述清楚)
-
“1(空格)” 这题目完全没有说空格.这不就是让我们猜么,我还猜了"1(空格).",没过.找到规律只有前面和后面的空格要删,里面的就当是字符串错了,所以
int wode=s.length()-1; for(;wode>=0;wode--) { if(s[wode]!=' ') break; } s=s.substr(0,wode+1); wode=0; for(;wode<s.length();wode++) { if(s[wode]!=' ') break; } int len=s.length()-wode; s=s.substr(wode,len);
删除前后的空格
-
“4e+” 这种底数和指数都是一个改法.就是使用st记录字符串开始的数字的下标,和整个字符串结尾下标进行比对,就可以.
if(st==s.length()) return false;
整体写的比较naive,没有什么章法,就是比较乱,但是题面也没说啥硬性指标,只能一个一个试,莫得办法.
代码
class Solution {
public:
bool check1(string s)
{
if(s.length()==0) return false;
int flag=-1;
int st=0;
if(s[0]=='+'||s[0]=='-') st++;
for(int pos=st;pos<s.length();pos++)
{
if(s[pos]=='.'){
if(flag!=-1)
return false;
else flag=pos;
}
else if(s[pos]>'9'||s[pos]<'0')
return false;
}
if(flag==st&&flag==s.length()-1) return false;
if(st==s.length()) return false;
return true;
}
bool check2(string s)
{
if(s.length()==0) return false;
int st=0;
if(s[0]=='+'||s[0]=='-') st++;
for(int pos=st;pos<s.length();pos++)
{
if(s[pos]>'9'||s[pos]<'0')
return false;
}
if(st==s.length()) return false;
return true;
}
bool isNumber(string s) {
int wode=s.length()-1;
for(;wode>=0;wode--)
{
if(s[wode]!=' ') break;
}
s=s.substr(0,wode+1);
wode=0;
for(;wode<s.length();wode++)
{
if(s[wode]!=' ') break;
}
int len=s.length()-wode;
s=s.substr(wode,len);
int pp=s.find("e");
if(pp==s.npos)
{
return check1(s);
}
else
{
string a=s.substr(0,pp),b=s.substr(pp+1);
return check1(a)&&check2(b);
}
}
};