LeetCode 剑指 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. 数组形式的整数加法 | 简单 | 数组模拟、进位 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!