leetcode 8. String to Integer (atoi)

本文详细解析了LeetCode第8题字符串转整数(atoi)的问题,包括题目的具体要求、实现思路、特别需要注意的溢出处理方式以及完整的C++代码实现。

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

leetcode 8. String to Integer (atoi)

标签(空格分隔): leetcode



1. 原题意思:

实现atoi() 实现将字符串转化为int型整数,至于多少种情况自己考虑。。

2.分析:

  • 空的字符串: “” ,判定为0
  • 普通的正负数: “-123”, “123”, “+123”
  • 开头带有空格的字符串: ” -123”, ” 123”, 去空格处理
  • 带有2个或以上的符号的字符串: “-+123”, ” +-123”, 判定为输出0
  • 带有非数字的字符串: ” -12a3”, 只需要输出在非数字前的值
  • 溢出问题:溢出分别取取最大最小值

3. 值得注意的溢出问题:

每次读取有意义的一位数字digit, 转化为数字后, 使用
result = result * 10 + digit
可以迭代到结果, 所以每次在result进行迭代的之前要判断结果会不会溢出。。
先用 result 与 INT_MAX /10 进行比较: 若 result > INT_MAX/10, 说明最终得到的整数一定会溢出, 故此时可以当即进行溢出处理。
当 result=INT_MAX/10 时,若 digit > INT_MAX%10,说明 result*10+digit 最终还是会溢出, INT_MIN一样。

但是值得注意的是, max_div = -INT_MIN / 10 的表示不对, 按照平时的数值来看, -INT_MIN应该是正数, max_div也该是正数。。但是结果是负数, 需要使用max_div = -(INT_MIN/10)

4. 代码

class Solution {
public:
   int myAtoi(string str) {
        int max_div = INT_MAX / 10;
        int min_div = -(INT_MIN / 10);
        int max_m = INT_MAX % 10;
        int min_m = -(INT_MIN % 10);

        int result = 0;
        int countSign = 0;
        int i = 0, len = str.length();
        int sign = 1;
        int digit = str[0];

        while (str[i] == ' ' || str[i] == '0') {
            i++;
        }

        while (str[i] == '-' || str[i] == '+') {
            if (str[i] == '-')  
                sign *= -1;

            countSign++;

            if (countSign > 1)
                return 0;

            i++;
        }


        while (i < len) {
            digit = str[i++] - '0';
            if (digit >= 0 && digit <= 9) {
                if (sign == 1 && (result > max_div || (result == max_div && digit > max_m)))
                    return INT_MAX;
                if (sign == -1 && (result > min_div || (result == min_div && digit > min_m)))
                    return INT_MIN;
            }
            else {
                break;
            }
            result = result * 10 + digit;

        }
        return (sign == 1) ? result : -result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值