Leetcode:65. 有效数字
验证给定的字符串是否为数字。
例如:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。
更新于 2015-02-10:C++
函数的形式已经更新了。如果你仍然看见你的函数接收 const char *
类型的参数,请点击重载按钮重置你的代码。
解题思路:
1. 排除首位的空格,如果全部是空格return false。最终确定left和right的位置。
2. 第一个字符可能是‘+’,‘-’,‘.’。left++。如果这一步出现了小数点,那么后面不能出现小数点。
3. 判断[left,right]之间是否是数字。之间只可能出现数字,正负号,e,E,除此之外直接返回false。
4. 另外,e(E)仅可能出现一次,且不能出现在left位置。
5. e后面必须要有东西,可以是正负号加至少一个数字,或者直接加数字。
6. 小数点仅可能出现在e(E)的前面,如果有e(E)的话。
本人亲测,这题运行时间不稳,4ms范例也是基本稳定在28ms处。所以不追究此题的速度问题。判断一个字符串是否是数字的时间复杂度是字符串长度(n)。
class Solution { public: bool isNumber(string s) { int size = s.size(); if (size == 0) return false; int left = 0, right = size-1; while (s[left] == ' '&&left < right) { left++; } while (s[right] == ' '&&left < right) { right--; } if (left == right) return (s[left]<='9' && s[left]>='0'); if (s[left] == '+' || s[left] == '-') { if (left == right) return false; left++; } if (!(s[left] <= '9' && s[left] >= '0')&& s[left]!='.') return false; int point = 1, e = 1; if (s[left] == '.') { point = 0; left++; if (!(s[left] <= '9' && s[left] >= '0')) { return false; } } while (left <= right) { if (s[left] <= '9'&&s[left] >= '0') {} else if (s[left] == '.') { if (e == 0) return false; if (point == 0) return false; point--; } else if (s[left] == 'e' || s[left] == 'E') { if (e == 0) return false; e--; if (left + 1 <= right) { if (s[left + 1] == '+' || s[left + 1] == '-') { if (left + 2 <= right) { if (!(s[left + 2] >= '0'&&s[left + 2] <= '9')) { return false; } else { left += 2; continue; } } else return false; } } else return false; } else return false; left++; } return true; } }; |