首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

LeetCode 65 Valid Number 詳細解析:有限狀態機與規則拆解

     編輯:C++ 入門

題目要求

判斷字符串是否為合法數字。合法格式包括:整數、小數、科學計數法(含 e/E),允許前導/尾隨空格、符號(+/-)、小數點。例如:"0"、" 0.1 "、"2e10" 合法;"abc"、"1 a" 非法。

核心難點

規則極其繁瑣:符號只能出現在開頭或 e/E 後;小數點最多一個且不能在 e/E 後;e/E 最多一個且前後必須有數字;空格只能在首尾。LeetCode 通過率僅 10%+,主因是邊界情況極多。

解法一:有限狀態機 (DFA) —— 推薦

定義狀態:START、SIGN、INT、DOT、DOT_DIGIT、E、E_SIGN、E_INT、END。根據輸入字符類型(空格、符號、數字、點、e/E)轉移。最終接受狀態為 INT、DOT_DIGIT、E_INT、END。

解法二:規則驅動的單遍歷(文中代碼思路)

用多個布爾標記記錄上下文:numSeen、dotSeen、eSeen、lastSpace 等。逐字符判斷:

  • 數字:標記 numSeen=true,若在 e 後則標記 eNumSeen。
  • 符號:只允許在開頭或 e 後且未讀數字/點時。
  • 點:只允許未見點且未見 e 時。
  • e/E:只允許已見數字且未見 e 時,後面必須跟數字。
  • 空格:只允許在未開始或已結束(lastSpace)時。

最終合法條件:numSeen && !eSeen || (eSeen && eNumSeen) 且無非法字符。

關鍵代碼邏輯(簡化版)

bool isNumber(const char* s) {
    bool num = false, dot = false, e = false, numAfterE = true;
    while (*s) {
        if (isspace(*s)) { if (num || dot || e) return false; }
        else if (*s == '+' || *s == '-') { if (num || dot || (e && numAfterE)) return false; }
        else if (isdigit(*s)) { num = true; if (e) numAfterE = true; }
        else if (*s == '.') { if (dot || e) return false; dot = true; }
        else if (*s == 'e' || *s == 'E') { if (e || !num) return false; e = true; numAfterE = false; }
        else return false;
        ++s;
    }
    return num && numAfterE;
}

測試用例建議

重點覆蓋:".1"、"3."、".e1"、"e"、" +0.1"、" -90e3 "、" 1e"、" . "、" . 1 "。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved