原题如下
验证给定的字符串是否为数字。
例如:
“0” => true
” 0.1 ” => true
“abc” => false
“1 a” => false
“2e10” => true
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。
说实话我真的是感觉出这题的人是NC,需要控制的地方太多了,主要是考逻辑思维。看到通过率10%左右,所以就想着提供一下注意事项,及自己的烂代码
此题需要注意以下几点
1.e最多只能有一个;
2.如果没有e的话(有一个e的时候 可以把以e为中间元素进行划分 左边 string left 右边string right 单独来看就是没有e的存在了,因为e最多一个 例如 s=“+10e2” left=“+10”right=“2”):
这个时候 + 或 - 最多只能有一个!!!!而且 必须在 s的首部;
3.中间部分不能有空格(两边的空格可以提前给删除掉) 否则直接 return false
4.小数点只能有1个 且只能在e的前面(如果在e的后面是错误的)
5.而且 小数点的前或者后可以没有数字(但是不能同时没有,必须要有一个)
注意 +.e2 是错误的
而 +.1e2 或者 +1.e2是正确的
6.+ 或 - 一共加起来可以有两个 (有两个的前提是有e 的存在 ps:这时候也就是上面2的括号内的情况 而且此时+ -分别在e的两边)
——-> 所以你需要知道 ’ e ’ ’ . ’ ’ + ’ ’ - ’ 的position 和他们的个数?
代码如下(真的是仅供参考。。。有些判断语句可以去掉,因为他给的测试数据中并不全面 )
class Solution {
public:
void qiege_space(string &s){
if (s.size() > 0){
for (int i = 0; i <= s.size() - 1;){
if (s[i] == ' ') s.erase(i, 1);
else break;
}
for (int j = s.size() - 1; j >= 0; j--){
if (s[j] == ' ') s.erase(j, 1);
else break;
}
}
}
bool isNumber(string s) {
qiege_space(s);
if (s.size() <= 0) return false;
for (int i = 0; i <= s.size() - 1; i++){
if (s[i] == ' ') return false;
}
vector<int> point, e, other, minus_sign, jiahao, count;
for (int i = 0; i <= s.size() - 1; i++){
if (s[i] == '.') point.push_back(i);
if (s[i] == 'e') e.push_back(i);
if (s[i] == '-') minus_sign.push_back(i);
if (s[i] == '+')jiahao.push_back(i);
int tmp = (int)s[i] - 48;
if (tmp >= 0 && tmp <= 9) count.push_back(i);
}
int other_size = s.size() - point.size() - e.size() - minus_sign.size() - jiahao.size() - count.size();
if (other_size>0) return false;
if (point.size() != 0){
if (point.size() > 1||s.size()==1) return false;
if (e.size() == 1){
if (point[0] > e[0]) return false;
}
else{
if (point[0] - 1 >= 0){
if (s[point[0] - 1] == '+' || s[point[0] - 1] == '-') {
if (point[0] + 1 >= s.size()) return false;
}
}
if (point[0] + 1 <= s.size() - 1){
if (s[point[0] + 1] == '+' || s[point[0] + 1] == '-') {
if (point[0] - 1 < 0) return false;
}
}
}
}
if (e.size() != 0){
if (e.size() > 1) return false;
if (s[0] == 'e' || s[s.size() - 1] == 'e') return false;
else {
string left = s.substr(0, e[0]);
string right = s.substr(e[0] + 1, s.size() - 1 - e[0]);
bool x=isNumber(left);
bool y = isNumber(right);
if (x == true && y == true) return true;
else return false;
}
}
else{
if (minus_sign.size() + jiahao.size() > 1) return false;
else{
if (minus_sign.size() == 1){
if (minus_sign[0] != 0 || s.size() == 1) return false;
else return true;
}
else if (jiahao.size() == 1){
if (jiahao[0] != 0 || s.size() == 1)return false;
else return true;
}
else return true;
}
}
}
};