iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
1
Software Development

LeetCode30系列 第 28

[LeetCode30] Day28 - 65. Valid Number

  • 分享至 

  • xImage
  •  

題目

給定一個string s, 判斷能不能解釋成十進制數字。

題目很好心得列了用來作有效的十進制的字元:

  • Numbers 0-9
  • Exponent 'e'
  • Positive/negative sign '+' / '-'
  • Decimal point '.'

解釋

以上有4個,我們為每個宣告一個bool,並從index=0開始,哪個有就變為true,沒有則false,然後看看是否符合規則。分別是 numberexpsignpoint

以下分別遇到的情況:

  • number
    • 出現數字,則number變true
  • Iexp
    • exp前面一定要有數字,所以number如果是false,就回傳false。
    • 反之將exp變為true
      • exp前的數字可以是 正數、負數,可以有小數點,所以我們就將另外3個變false。
      • 因為後續還需要有出現數字才行。那exp後的數字只能是正負數,小數不行。這部分在小數那判斷
  • sign
    • sign一定出現在數字前,所以如果numberpoint是true,則回傳false
    • sign如果是false,則變true,反之代表出現第二次了,回傳false
  • point
    • 前面說exp後不能出現小數點,所以這裡判斷如果exp是true,則回傳false。
    • point如果是false,則變true,反之代表出現第二次了,回傳false。

如果是這些以外的字元,則會跳出迴圈。

  • 那在進入迴圈之前,因為string中可能有空白 ' ',所以先讓idx跑到非空白的位置。
  • 那迴圈完,做一樣的事情,如果只剩空白,就一定能跑到最後(idx== s.size()),number又是true的話,則回傳true。
  • 不能跑到最後,就代表有其他的字元啦('a','b',...),那就一定不能解釋成有效的十進制數字,所以回傳false。

Code

class Solution {
public:
    bool isNumber(string s) {
        bool exp = false;
        bool number = false;
        bool sign = false;
        bool point = false;
        int idx = 0;
        
        for(idx = 0; idx < s.size() && s[idx] == ' '; idx++);
        
        for(; idx < s.size(); idx++){
            if(isdigit(s[idx])) {
                number = true;
            }    
            else if(s[idx] == '+' || s[idx] == '-'){
                if (number || point){
                    return false;
                }
                if (!sign){
                    sign = true;
                }
                else{
                    return false;
                }
            }
            else if(s[idx] == '.'){
                if (exp){
                    return false;   
                }
                if (!point){
                    point = true;
                }
                else{
                    return false;
                }
            }
            else if(s[idx] == 'e'){
                if(!number){
                    return false;
                }
                if(!exp){
                    exp = true;
                }
                else{
                    return false;
                }
                sign = false;
                point = false;
                number = false;
            }
            else{
                break;
            }
        }
        for(; idx < s.size() && s[idx] == ' '; idx++);
        return number && idx == s.size();
    }
};

https://ithelp.ithome.com.tw/upload/images/20201013/201291472yudi10z3E.png


上一篇
[LeetCode30] Day27 - 42. Trapping Rain Water
下一篇
[LeetCode30] Day29 - 432. All O`one Data Structure
系列文
LeetCode3030
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言