LeetCode 剑指 Offer 67. 把字符串转换成整数

题目描述

剑指 Offer 67. 把字符串转换成整数

思路分析

解法一:模拟扫描(推荐)

核心思路

  • 跳过前导空格,识别正负号。
  • 逐字符读取数字并累积结果,遇到非数字立即停止。
  • 在累积过程中用 64 位承载,超过 32 位整数边界时直接截断。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示字符串长度。
  • 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
    public int strToInt(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }

        int n = str.length();
        int i = 0;

        // 跳过前导空格
        while (i < n && str.charAt(i) == ' ') {
            i++;
        }

        int sign = 1;
        if (i < n && (str.charAt(i) == '+' || str.charAt(i) == '-')) {
            sign = str.charAt(i) == '-' ? -1 : 1;
            i++;
        }

        long num = 0;

        // 逐字符累积并处理溢出
        while (i < n) {
            char c = str.charAt(i);
            if (c < '0' || c > '9') {
                break;
            }

            num = num * 10 + (c - '0');

            if (sign == 1 && num > Integer.MAX_VALUE) {
                return Integer.MAX_VALUE;
            }
            if (sign == -1 && -num < Integer.MIN_VALUE) {
                return Integer.MIN_VALUE;
            }

            i++;
        }

        return (int) (sign * num);
    }
}
func strToInt(str string) int {
	const intMax = 1<<31 - 1
	const intMin = -1 << 31

	if len(str) == 0 {
		return 0
	}

	i := 0

	// 跳过前导空格
	for i < len(str) && str[i] == ' ' {
		i++
	}

	sign := 1
	if i < len(str) && (str[i] == '+' || str[i] == '-') {
		if str[i] == '-' {
			sign = -1
		}
		i++
	}

	var num int64

	// 逐字符累积并处理溢出
	for i < len(str) {
		c := str[i]
		if c < '0' || c > '9' {
			break
		}

		num = num*10 + int64(c-'0')

		if sign == 1 && num > int64(intMax) {
			return intMax
		}
		if sign == -1 && -num < int64(intMin) {
			return intMin
		}

		i++
	}

	return int(num) * sign
}

相似题目

题目 难度 考察点
8. 字符串转换整数 (atoi) 中等 字符串解析、模拟
65. 有效数字 困难 有限状态机、字符串解析
7. 整数反转 中等 数学、溢出处理
415. 字符串相加 简单 字符串模拟、进位
43. 字符串相乘 中等 字符串模拟、大数
989. 数组形式的整数加法 简单 数组模拟、进位
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/74889191
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!