LeetCode 剑指 Offer 20. 表示数值的字符串

题目描述

剑指 Offer 20. 表示数值的字符串

image-20241107205156269

思路分析

解法一:一次扫描(推荐)

核心思路

  • 去除首尾空格后逐字符扫描。
  • 记录是否出现过数字、点号、指数以及指数后的数字。
  • 遇到不合法位置的符号或字符直接返回 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. 字符串相加 简单 字符串模拟
本文作者:
本文链接: https://hgnulb.github.io/blog/2022/39895546
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!