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;
    }
};
posted @ 2025-10-22 14:10  saulstavo  阅读(5)  评论(0)    收藏  举报