LeetCode 剑指 Offer 20. 表示数值的字符串
题目描述

思路分析
解法一:一次扫描(推荐)
核心思路:
- 去除首尾空格后逐字符扫描。
- 记录是否出现过数字、点号、指数以及指数后的数字。
- 遇到不合法位置的符号或字符直接返回 false。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
public boolean isNumber(String s) {
if (s == null) {
return false;
}
s = s.trim();
if (s.length() == 0) {
return false;
}
boolean seenDigit = false;
boolean seenDot = false;
boolean seenExp = false;
boolean digitAfterExp = true;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
seenDigit = true;
if (seenExp) {
digitAfterExp = true;
}
} else if (c == '.') {
if (seenDot || seenExp) {
return false;
}
seenDot = true;
} else if (c == 'e' || c == 'E') {
if (seenExp || !seenDigit) {
return false;
}
seenExp = true;
digitAfterExp = false;
} else if (c == '+' || c == '-') {
if (i != 0 && s.charAt(i - 1) != 'e' && s.charAt(i - 1) != 'E') {
return false;
}
} else {
return false;
}
}
return seenDigit && digitAfterExp;
}
}
import "strings"
func isNumber(s string) bool {
s = strings.TrimSpace(s)
if len(s) == 0 {
return false
}
seenDigit := false
seenDot := false
seenExp := false
digitAfterExp := true
for i := 0; i < len(s); i++ {
c := s[i]
if c >= '0' && c <= '9' {
seenDigit = true
if seenExp {
digitAfterExp = true
}
} else if c == '.' {
if seenDot || seenExp {
return false
}
seenDot = true
} else if c == 'e' || c == 'E' {
if seenExp || !seenDigit {
return false
}
seenExp = true
digitAfterExp = false
} else if c == '+' || c == '-' {
if i != 0 && s[i-1] != 'e' && s[i-1] != 'E' {
return false
}
} else {
return false
}
}
return seenDigit && digitAfterExp
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 65. 有效数字 | 困难 | 字符串解析 |
| 剑指 Offer 20. 表示数值的字符串 | 中等 | 字符串解析 |
| 8. 字符串转换整数 (atoi) | 中等 | 字符串解析 |
| 43. 字符串相乘 | 中等 | 字符串模拟 |
| 415. 字符串相加 | 简单 | 字符串模拟 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!