剑指OFFER 表示数值的字符串
剑指OFFER 表示数值的字符串
这道题主要考察的是对"如何表达数字"的理解,如何对这种表示建立一套可行的规则.
最初我的想法是从头到尾一个字符一个字符进行扫描,并且前面的扫描会对后面的扫描产生影响(出现无效字符就中断),如果扫描全程都没有被中断那么就判断该字符串是有效的.但是这种方法可读性比较差,会掺杂大量的if else 判断.
为了简化代码和捋清思路,我还是按照传统的方法,将复杂问题分解成小问题的方式来解决.
增设两个函数
一个函数判断是否是纯数字
一个函数判断是否是带小数点的纯数字
最后根据e/E的位置对字符串进行分解,然后用上述函数分别进行判断,最终得出结果.
class Solution {
public:
//左闭右开
//第一个字符一定是+或者-或者0~9
//之后是只带一个小数点的纯数字
bool is_number(char* str,int left,int right)
{
if(str[left]!='+'&&str[left]!='-'&&str[left]<'0'&&str[left]>'9')
return false;
int pos = left + 1;
bool dot = false;
while(str[pos]>='0'&&str[pos]<='9'&&pos<right||str[pos]=='.')
{
if(str[pos]=='.')
{
if(dot == true)return false;
dot = true;
}
pos++;
}
return pos == right;
}
//左闭右开
//第一个字符一定是+或者-或者0~9
//之后都是纯数字
bool is_number_without_dot(char* str,int left,int right)
{
if(str[left]!='+'&&str[left]!='-'&&str[left]<'0'&&str[left]>'9')
return false;
int pos = left + 1;
while(str[pos]>='0'&&str[pos]<='9'&&pos<right)
{
pos++;
}
return pos == right;
}
bool isNumeric(char* str)
{
int pos = 0;//最终pos表示str的长度
int pos_e = -1;//是否存在e/E
while(str[pos] != '\0')
{
if(str[pos]=='e'||str[pos]=='E')
{
pos_e = pos;
}
pos++;
}
if(pos_e == -1)
{
//如果不是指数形式,那么只需要判断是否是带小数点的数字即可
return is_number(str,0,pos);
}else{
//如果是指数形式
//那么就分成两半,左边是带小数点的数字,右边是纯数字分别进行判断
return is_number(str,0,pos_e) && is_number_without_dot(str,pos_e+1,pos);
}
}
};