二刷LeetCode--8. 字符串转换整数 (atoi)(C++版本)

该代码段展示了一个C++类方法myAtoi,用于从给定的字符串中解析出一个整数。方法首先处理前导空格,然后检查正负号,接着读取数字部分,同时进行越界检查。如果数值超出INT_MAX或INT_MIN,则返回相应最大或最小整数值。方法使用了字符到数字的转换,并在处理过程中考虑了符号和整数范围的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题需要注意的是越界的判断,如果不能记住2的31次方的话可以使用pow函数进行计算,然后依次进行字符的读入即可,在计算的时候需要将字符转化为数字进行计算.最后需要与现有的结果和越界值进行比较,如果越界了需要按照题目的要求进行取舍.

class Solution {
public:
    int myAtoi(string s) {
        // int index = 0;
        // while(index < s.length())
        // {
        //     // 让index移动到第一个字符的位置
        //     if(s[index] != ' ')
        //         break;
        //     ++index;
        // }
        // // 处理正负号
        // // 定义标志位默认为1,方便最后的结果判断
        // int flag = 1;
        // if(s[index] == '+')
        //     ++index;
        // else if(s[index] == '-')
        // {
        //     ++index;
        //     flag = -1;
        // }
        // int res = 0;
        // // 然后开始处理数字部分
        // while(index < s.length())
        // {
        //     // 如果当前的字符不是数字的话就退出循环
        //     if(s[index] < '0' || s[index] > '9')
        //         break;
        //     // 异常处理
        //     if (res > INT_MAX / 10 || (res == INT_MAX / 10 && (s[index] - '0') > INT_MAX % 10)) {
        //         return INT_MAX;
        //     }
        //     if (res < INT_MIN / 10 || (res == INT_MIN / 10 && (s[index] - '0') > -(INT_MIN % 10))) {
        //         return INT_MIN;
        //     } 
        //     // 通过将字符转换为数字并且通过加和的方式对最终的数字进行计算
        //     res = res * 10 + flag * (s[index] - '0');
        //     ++index;
        // }
        // return res;
        int index = 0;
        long res = 0;
        bool flag = true;
        // 这里必须使用有符号整数定义,否则不通过,会超出范围或者类型定义不对导致结果为0
        // unsigned int MAX = 2147483648; //2^31
        unsigned int MAX = pow(2, 31); //2^31
        // 直接前导空格
        while(s[index] == ' ')
            ++index;
        // 考虑符号
        if(s[index] == '-')
        {
            // flag为假表示负数
            flag = false;
            ++index;
        }
        // 这里必须是判断,否则会把任意的下一个字符计算进去
        else if(s[index] == '+')
            ++index;
        // 读取数字
        while(s[index] >= '0' && s[index] <= '9' && res <= MAX)
        {
            // 这里需要注意拿到的数据是字符,因此需要转换为数字
            res = res * 10 + s[index] - '0';
            ++index;
        }
        // 考虑如果超出范围怎么办以及正负号的问题,这俩问题可以合二为一处理
        if(flag)
            res = res > MAX - 1 ? MAX - 1 : res;
        else
            res = (-1) * (res > MAX ? MAX : res);
        return res;
    }
};


// class Solution {
// public:
//     int myAtoi(string s) {
//         const unsigned int MAX = 2147483648;
//         int i = 0; 
//         bool isEegative = false;
//         long ans = 0;
//         // 跳过前导空格
//         while (s[i] == ' ') i++;
//         // 检查符号
//         if (s[i] == '-') {
//             isEegative = true;
//             i++;
//         } else if (s[i] == '+') {
//             i++;
//         }
//         // 读取数字
//         while (s[i] >= '0' && s[i] <= '9' && ans <= MAX) {
//             ans = ans * 10 + s[i] - '0';
//             i++;
//         }
//         // 处理整数范围
//         if (isEegative) {
//             return  -1 * (ans > INT32_MAX ? MAX : ans);
//         } else {
//             return (ans > INT32_MAX ? INT32_MAX : ans);
//         }
//     }
// };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值