8. 字符串转换整数 (atoi)
问题
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s) 的算法如下:
空格:读入字符串并丢弃无用的前导空格(" ")
符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。
返回整数作为最终结果。
示例 1:
输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
带下划线线的字符是所读的内容,插入符号是当前读入位置。
分析
使用while跳过前导空格,前导0,使用sign记录正负(没有正负号就是正),然后按ASCII码转换为数字s[x] - '0'即可,之后循环,res先乘10再加上新数字。切不可先加上新数字再乘10,否则最后会多乘一个10,比如答案42,那么就会是420.
INT_MAX以及INT_MIN头文件是#include <climits>.
代码
class Solution {
public:
int myAtoi(string s) {
int x = 0;
int n = s.size();
int res = 0;
while(x < n && s[x] == ' ') {x++;}
int sign = 1;
if (x < n && s[x] == '-') {sign = -1; x++;}
else if (x < n && s[x] == '+') {x++;}
while(x < n && s[x] == '0') {x++;}
while(x < n && s[x] <= '9' && s[x] >= '0') {
if (10LL*res + (s[x] - '0') > INT_MAX) {
res = sign == 1 ? INT_MAX : INT_MIN;
return res;
}
res *= 10;
res += s[x]-'0';
x++;
}
return sign*res;
}
};

浙公网安备 33010602011771号