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

这个题需要注意的是越界的判断,如果不能记住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);
//         }
//     }
// };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值