8. 字符串转换整数 (atoi) - 力扣(LeetCode)

参考 力扣7 面对三十二位带符号整数的范围限制,用到INT_MAXINT_MIN两个常量限定范围。(应对leetcode中的溢出问题)

【力扣8】字符串转换整数_标志符号

  • 使用 long long
class Solution {
public:
    int myAtoi(string s) {
        int k = 0;
        while(k<s.size() && s[k]==' ') k++;//处理空格
        if(k==s.size()) return 0;//空字符串的情况

        int minus = 1;//标志符号
        if(s[k]=='-') minus = -1, k++;
        else if(s[k]=='+') k++;

        long long res = 0;
        while(k<s.size() && s[k]>='0' && s[k]<='9'){
            res = res*10+s[k]-'0';//字符转数字
            k++;
            if(res > INT_MAX) break;//超出32位范围
        }
        res *= minus;//计算正负
        if(res > INT_MAX) res = INT_MAX;
        if(res < INT_MIN) res = INT_MIN;
        return res;
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 使用 int
class Solution {
public:
    int myAtoi(string s) {
        int k = 0;
        while(k<s.size() && s[k]==' ') k++;//处理空格
        if(k==s.size()) return 0;//空字符串的情况

        int minus = 1;//标志符号
        if(s[k]=='-') minus = -1, k++;
        else if(s[k]=='+') k++;

        int res = 0;
        while(k<s.size() && s[k]>='0' && s[k]<='9'){
            //int主要在于此处是否会溢出
            int x = s[k]-'0';
            if(minus>0 && res>(INT_MAX-x)/10) return INT_MAX;//判断同力扣7题中
            if(minus<0 && -res<(INT_MIN+x)/10) return INT_MIN;
            //此处由于INT_MIN为负数,比INT_MAX的绝对值大1;当输入INT_MIN时,正数形式的计算会产生错误,因此需要单独处理
            if(-res*10-x == INT_MIN) return INT_MIN;
            res = res*10+x;
            k++;
            if(res > INT_MAX) break;//超出32位整数范围,跳出
        }
        res *= minus;//计算正负
        if(res > INT_MAX) res = INT_MAX;// 处理溢出情况
        if(res < INT_MIN) res = INT_MIN;
        return res;
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.