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

LeetCode 65:驗證字符串是否為數字

     編輯:關於C++

題目描述

給定一個字符串,判斷其是否能表示一個合法的數字。合法數字包括整數、小數、科學計數法表示等形式,並允許前後空格、正負號。

合法數字示例

  • "0" → true
  • " 0.1 " → true
  • "abc" → false
  • "1 a" → false
  • "2e10" → true

核心判斷邏輯

主要難點在於覆蓋所有邊界情況。允許的情況包括:

  1. 前導和尾隨空格
  2. 可選的 '+' 或 '-' 號
  3. 小數點前後可無數字(如 "1."、".34"、"+.1")
  4. 科學計數法中的 'e' 或 'E',但要求:
  • 整個字符串中只能出現一次 'e'/'E'
  • 'e'/'E' 後必須跟隨整數(可帶符號)
  • 小數點在整個字符串中最多出現一次(不含指數部分)

解題思路

採用狀態機或逐字符掃描配合標記變量:

  1. 先去除首尾空格
  2. 遍歷字符,記錄是否遇到數字、小數點、指數符號、指數後的數字
  3. 遇到非法字符或違反規則(如重複小數點、指數後無數字)即返回 false
  4. 最終需確保至少有一個數字,且指數部分若存在則其後必有數字

參考實現(C++)

class Solution {
public:
    bool isNumber(const char *s) {
        if (!s) return false;
        int i = 0, n = strlen(s);
        // 跳過前導空格
        while (i < n && s[i] == ' ') ++i;
        // 跳過尾隨空格
        while (n > i && s[n-1] == ' ') --n;
        if (i >= n) return false;

        bool numSeen = false, dotSeen = false, eSeen = false;
        for (int j = i; j < n; ++j) {
            char c = s[j];
            if (c >= '0' && c <= '9') {
                numSeen = true;
            } else if (c == '.') {
                if (dotSeen || eSeen) return false;
                dotSeen = true;
            } else if (c == 'e' || c == 'E') {
                if (eSeen || !numSeen) return false;
                eSeen = true;
                numSeen = false; // 指數部分需重新檢測數字
            } else if (c == '+' || c == '-') {
                if (j != i && s[j-1] != 'e' && s[j-1] != 'E') return false;
            } else {
                return false;
            }
        }
        return numSeen;
    }
};

複雜度分析

  • 時間複雜度:O(n),單次遍歷
  • 空間複雜度:O(1),常數額外空間
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved