返回
LeetCode 8:字符串转换成整数(atoi)- 算法解析与技巧
前端
2023-12-18 09:37:24
用简单步骤掌握字符串到整数转换
目录
- 字符串到整数转换的算法步骤
- 有用技巧
- 代码示例(C++、Python、Java)
- 总结
- 常见问题解答
算法步骤
字符串到整数转换涉及以下步骤:
- 预处理: 删除字符串两端的空格,检查第一个字符是否是符号(正号或负号)。
- 提取数字: 从字符串中提取数字字符,直到遇到非数字字符。
- 处理边界情况: 确保数字字符串在 32 位有符号整数范围内。
- 类型转换: 将数字字符串转换为整数。
有用技巧
- 使用 long long 数据类型: 避免整数溢出。
- 考虑正负号: 提取数字时考虑符号影响。
- 流式输入: 使用流式输入简化代码(例如,使用 C++ 中的 istringstream 类)。
代码示例
C++:
int myAtoi(string s) {
// 预处理
s = trim(s);
if (s.empty()) return 0;
int sign = 1;
if (s[0] == '-' || s[0] == '+') {
sign = (s[0] == '-') ? -1 : 1;
s = s.substr(1);
}
// 提取数字
string numStr;
for (char c : s) {
if (isdigit(c)) {
numStr += c;
} else {
break;
}
}
// 处理边界情况
long long num = stoll(numStr);
if (num * sign < INT_MIN) return INT_MIN;
if (num * sign > INT_MAX) return INT_MAX;
// 类型转换
return num * sign;
}
Python:
def myAtoi(s):
# 预处理
s = s.strip()
if not s: return 0
sign = 1
if s[0] in ('-', '+'):
sign = -1 if s[0] == '-' else 1
s = s[1:]
# 提取数字
numStr = ""
for c in s:
if c.isdigit():
numStr += c
else:
break
# 处理边界情况
num = int(numStr)
if num * sign < -2**31: return -2** 31
if num * sign > 2**31 - 1: return 2** 31 - 1
# 类型转换
return num * sign
Java:
public int myAtoi(String s) {
// 预处理
s = s.trim();
if (s.isEmpty()) return 0;
int sign = 1;
if (s.charAt(0) == '-' || s.charAt(0) == '+') {
sign = (s.charAt(0) == '-') ? -1 : 1;
s = s.substring(1);
}
// 提取数字
StringBuilder numStr = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
numStr.append(c);
} else {
break;
}
}
// 处理边界情况
long num = Long.parseLong(numStr.toString());
if (num * sign < Integer.MIN_VALUE) return Integer.MIN_VALUE;
if (num * sign > Integer.MAX_VALUE) return Integer.MAX_VALUE;
// 类型转换
return (int) (num * sign);
}
总结
理解字符串到整数转换的算法步骤和技巧,对解决 LeetCode 等编程问题至关重要。本文提供了详细的解释、代码示例和常见问题解答,帮助你轻松掌握这一重要概念。
常见问题解答
1. 如何处理含有非法字符的字符串?
忽略非法字符,只提取数字字符。
2. 如果数字字符串超出整数范围怎么办?
将其截断为最小/最大值。
3. 正负号如何影响结果?
在类型转换之前乘以符号(-1 或 1)。
4. 流式输入有什么优势?
简化了代码,允许逐步解析字符串。
5. 如何防止整数溢出?
使用 long long 数据类型来存储中间结果。