字符串转换整数 (atoi)
题目描述
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
- 空格:读入字符串并丢弃无用的前导空格(
" ") - 符号:检查下一个字符(假设还未到字符末尾)为
-还是+。如果两者都不存在,则假定结果为正。 - 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为
0。 - 舍入:如果整数数超过 32 位有符号整数范围
[−2^31, 2^31 − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于−2^31的整数应该被舍入为−2^31,大于2^31 − 1的整数应该被舍入为2^31 − 1。
返回整数作为最终结果。
示例
- 示例1
- 示例2
- 示例3
输入:s = "42"
输出:42
输入:s = "-042"
输出:-42
输入:s = "4193 with words"
输出:4193
提示:
0 <= s.length <= 200s由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-'和'.'组成
解题思路
- 解法1
模拟转换过程
- 读取并丢弃前导空格
- 读取符号
- 读取数字并转换为整数
- 检查是否越界并进行处理
时间复杂度:O(n) 空间复杂度:O(1)
C++ 解法
- 解法1
#include <string>
class Solution {
public:
int myAtoi(std::string s) {
int length = s.length();
int index = 0;
// 检查空格
while (index < length && s[index] == ' ') {
index++;
}
if (index == length) return 0; // 所有字符都是空格
// 检查符号位
int sign = 1;
if (s[index] == '-' || s[index] == '+') {
sign = (s[index] == '-') ? -1 : 1;
index++;
}
// 检查数字并计算结果
long long result = 0;
while (index < length && isdigit(s[index])) {
int digit = s[index] - '0'; // 字符转换为数字
// 检查是否超过整数范围
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > INT_MAX % 10)) {
return (sign == 1) ? INT_MAX : INT_MIN;
}
result = result * 10 + digit;
index++;
}
return static_cast<int>(result * sign);
}
};
LeetCode链接: 7. 整数反转