Valid Number
Difficualty:Hard
Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
这道题的通过率很低,只有12.7%,题目就是判断一个字符串是否是一个数值。
需要注意的几点是:
1、头尾有空格也算是正确的数值。
2、数值中除了数字,还可以出现的就只有+、-、e和.,并且e和.只能出现一次,并且以从左到右的顺序,.必须先于e出现。
3、+、-只能出现在数值的开头或者跟在e的后面,并且+、-的后紧跟的只能是数字或.。
4、e不能出现在头尾。
5、.的相邻的左右两边至少有一边是数字。
我的方法是先遍历一遍数值的每一位,记录每一位的类型,保存在另一个数组里,并且同时判断有多个e或者多个.的情况,然后再便利生成的数组,分析每一位是否符合要求。
bool isNumber(string s) {
int start = 0;
int end = s.size();
for (int i = 0; i < s.size(); i++){//去掉头部空格
if ((int)s[i] == 32)
start++;
else
break;
}
for (int i = s.size()-1; i >=0; i--){//去掉尾部空格
if ((int)s[i] == 32)
end--;
else
break;
}
string str = s.substr(start, end - start);//去掉头尾空格后的字符串
if (str.size() == 0)
return false;
bool haveDot = false;//是否有点
bool haveE = false;//是否有e
bool meetE = false;//用来判断.是不是出现在e后面
vector<int> vail(str.size(), 0);//用来保存数值的每一位的类型 0是数字 1是. 2是e 3是+-
for (int i = 0; i < str.size(); i++){
int c = (int)str.at(i);
if (c >= 48 && c <= 57)//数字
continue;
else if(c==46){//.
vail[i] = 1;
if (haveDot)
return false;
else
haveDot = true;
}
else if (c==101){//e
vail[i] = 2;
if (haveE)
return false;
else
haveE = true;
}
else if (c==43||c==45){//+-
vail[i] = 3;
}
else//其他字符
return false;
}
for (int i = 0; i < vail.size(); i++){
if (vail[i]==2){//e
meetE = true;
if (i == 0 || i == (vail.size() - 1))//e出现在头尾
return false;
}
else if (vail[i] == 1){//.
if (meetE)//.出现在e之后
return false;
if (i == (vail.size() - 1)){//.在尾部
if (i - 1 >= 0){
if (vail[i - 1] != 0)
return false;
}
else
return false;
}
else if (i == 0){//.在头部
if (i + 1 < vail.size()){
if (vail[i + 1] != 0)
return false;
}
else
return false;
}
}
else if (vail[i] == 3){//+-
if (i == vail.size() - 1)//+-在尾部
return false;
if (i != 0){//+-不在头部
if (vail[i - 1] != 2 || (vail[i + 1] != 0 && vail[i + 1] != 1))//此时+-左边只能是e 右边只能是数字或.
return false;
}
else{//+-在头部
if (vail[i + 1] != 0 && vail[i + 1] != 1)//此时+-右边只能是数字或.
return false;
}
}
}
return true;
}