【字符串】力扣8. 字符串转换整数 (atoi)题解

题目类型:

该题属于字符串处理边界条件处理的类型,重点考查字符串转换为整数的能力。

考点:

  1. 字符串遍历与处理:包括跳过前导空格、识别符号和有效数字的提取。
  2. 边界条件处理:处理整数转换中的溢出情况,确保结果在 INT_MININT_MAX 范围内。
  3. 错误处理与异常情况:如无有效数字、只有符号字符、溢出等情况的处理。

常见错误与注意点:

  1. 字符转换为数字的错误

    直接使用字符进行数学运算时,忘记将字符转换为对应的数字。例如,s[i] - '0' 是将字符 s[i] 转换为对应的整数值。
  2. 溢出处理不当

    在累加数字时,如果不进行溢出检查,可能会导致结果溢出。例如,当 result > (INT_MAX - digit) / 10 时,继续累加将导致超出 INT_MAXINT_MIN
  3. 忽略空字符串或全空格字符串

    忽略了输入可能是空字符串或只包含空格的情况,这些情况需要返回 0
  4. 符号处理错误

    在符号处理后,没有正确地将符号应用到结果上。例如,只考虑了正负号,但没有在最终返回时正确地反映符号。
  5. 无效字符处理

    遇到非数字字符时,没有正确停止转换。如果继续处理,将导致不正确的结果。
class Solution {
public:
//     std::string getLastWord(const std::string& s) {
//     size_t lastSpace = s.find_last_of(" \t\n\r\f\v");
//     return (lastSpace == std::string::npos) ? s : s.substr(lastSpace + 1);
// }
//     bool isPos(const std::string& s){
//         return (s[0] == '-')? false : true;
//     }

    int myAtoi(std::string s) {
        int i = 0, n = s.size();
        // 1. 丢弃前导空格
        while (i < n && s[i] == ' ') i++;

        // 2. 检查符号
        bool isNegative = false;
        if (i < n && (s[i] == '-' || s[i] == '+')) {
            isNegative = (s[i] == '-');
            i++;
        }

        // 3. 转换数字并避免溢出
        int result = 0;
        while (i < n && isdigit(s[i])) {
            int digit = s[i] - '0';
            if (result > (INT_MAX - digit) / 10) { // 检查是否溢出
                return isNegative ? INT_MIN : INT_MAX;
            }
            result = result * 10 + digit;
            i++;
        }

        // 4. 应用符号
        return isNegative ? -result : result;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值