Leetcode:65. 有效數字
阿新 • • 發佈:2018-12-19
驗證給定的字串是否為數字。
例如:"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; } }; |