1. 程式人生 > >Leetcode:65. 有效數字

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)。

C++程式碼
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;     } };