LeetCode65——Valid Number
这个题目给定的拿督评分是Hard,做了之后发现,它真正Hard的地方不在于这个题目有多难想,而是由多恶心
判断字符串是否是数字,由于题目的示例没有给太多的Sample input,所以很多情况你并不知道是不是数字,这就会影响你的判断,
另外,比如前后导的空格,冗余的加减符号,这些没有给明确说明,很多都是在提交的时候,它告诉你wrong answer你才恍然大悟。
好了,说说这个题目我的思路,无非就是记录几个特殊字符的索引和个数,根据这些来判断。
可能比较繁冗,期待更简单的办法。
代码:
class Solution {
public:
bool isNumber(string s) {
int count = 0;
int indexDot = -1;
int dotCount = 0;
int indexE = -1;
int eCount = 0;
int signCount = 0;
int plusCount=0;
int plusIndex=-1;
int minCount=0;
int minIndex=-1;
auto it = s.begin();
while (*it == ' ')
{
s.erase(it);
//it++;
}
while (*it == '-' || *it == '+')
{
if (*it == '-' || *it == '+')
signCount++;
s.erase(it);
//it++;
}
if (signCount > 1)
return false;
//删除后置空格
it = s.end() - 1;
while (*it == ' ')
{
s.erase(it);
it--;
}
int len = s.size();
if (len == 0)
return false;
for (int i = 0; i < len; i++)
{
if ((isalpha(s[i]) && s[i] != 'e') || s[i] == ' ')
return false;
else if (s[i] <= '9'&&s[i] >= '0')
{
count++;
}
else if (s[i] == 'e')
{
eCount++;
indexE = i;
}
else if (s[i] == '.')
{
dotCount++;
indexDot = i;
}
else if (s[i] == '+')
{
plusCount++;
plusIndex=i;
}
else if(s[i]=='-')
{
minCount++;
minIndex=i;
}
else
{
return false;
}
}
if (dotCount>1 || eCount > 1)
return false;
if (indexE == len - 1)
return false;
if (indexE>-1 && indexE < indexDot)
return false;
if (indexE == 0)
return false;
if (count == 0)
return false;
if (indexDot == 0 && (indexE == len - 1 || indexE == 1))
return false;
if(plusIndex>-1&&(plusIndex==len-1||plusCount>1||plusIndex!=indexE+1))
return false;
if(minIndex>-1&&(minIndex==len-1||minCount>1||minIndex!=indexE+1))
return false;
return true;
}
};