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

LeetCode 驗證數值字符串:有限狀態機解析科學計數法

     編輯:關於C++

LeetCode 驗證數值字符串:有限狀態機解析科學計數法


題目描述

判斷一個字符串是否為合法數值。合法數值包括:整數、小數、科學計數法(含 e/E)、可選正負號、可選前後空格。

範例:

輸入: " -3.2e-23 "
輸出: true

合法: "0.1", "2e10", "-90e3", "3.", ".5", "6e-1"
非法: "abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"

解題思路:線性掃描 + 狀態標記

題目未給出嚴格定義,需通過測試用例歸納規則。採用單次遍歷 + 多標記位法:

  1. strip() 去除首尾空格
  2. 處理可選符號(+/-)
  3. 掃描 e 前部分:數字、小數點、小數點後數字 → 標記 is_numeric
  4. 若遇到 e/E 且前部分合法:處理指數部分(可選符號 + 數字) → 標記 is_exp
  5. 最終合法條件:is_numeric && is_exp && 全串遍歷完

時間複雜度:O(n),空間複雜度:O(1)。

Python 參考實現

class Solution:
    def isNumber(self, s):
        """
        :type s: str
        :rtype: bool
        """
        s = s.strip()
        n = len(s)
        i = 0
        
        # 符號
        if i < n and (s[i] == '+' or s[i] == '-'):
            i += 1
        
        is_numeric = False
        is_exp = True  # 無 e 時默認 true
        
        # e 前的數字
        while i < n and s[i].isdigit():
            i += 1
            is_numeric = True
        
        # 小數點及後續數字
        if i < n and s[i] == '.':
            i += 1
            while i < n and s[i].isdigit():
                i += 1
                is_numeric = True
        
        # 科學計數法 e/E
        if is_numeric and i < n and (s[i] == 'e' or s[i] == 'E'):
            i += 1
            is_exp = False  # 有 e 時需驗證指數部分
            if i < n and (s[i] == '+' or s[i] == '-'):
                i += 1
            while i < n and s[i].isdigit():
                i += 1
                is_exp = True
        
        return is_numeric and is_exp and i == n

# 測試
if __name__ == "__main__":
    sol = Solution()
    assert sol.isNumber("3.e-23") == True
    assert sol.isNumber(".2e81") == True
    assert sol.isNumber("2e10") == True
    assert sol.isNumber(" 0.1") == True
    assert sol.isNumber("1 b") == False
    assert sol.isNumber("3-2") == False
    assert sol.isNumber("abc") == False
    assert sol.isNumber("") == False
    assert sol.isNumber(".") == False
    assert sol.isNumber(".1") == True
    print("所有測試通過")

核心要點總結

  • 分段驗證:將字符串拆解為「符號 → 數字/小數點 → e → 指數」四階段
  • 標記位設計:is_numeric 確保主體有數字,is_exp 確保 e 後有數字
  • 邊界細節:. 前後可無數字(但至少一邊有),e 後不可有小數點,首尾空格合法
  • 工程思維:無需構建完整 FSM,線性掃描 + 條件判斷即可高效解決

這道題被稱為「面試殺手」,關鍵在於完整覆蓋邊界情況而非演算法複雜度。掌握「分段驗證 + 標記位」模式,可應對各類字符串格式驗證問題。

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