剑指offer 把字符串转换成整数 C++11

把字符串转换成整数

https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&tqId=11202&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

把字符串转换成整数

  • 题目描述
    将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
    数值为0或者字符串不是一个合法的数值则返回0。

  • 输入描述:
    输入一个字符串,包括数字字母符号,可以为空。

  • 输出描述:
    如果是合法的数值表达则返回该数字,否则返回0。

  • *注意:越界情况需要讨论 -2147483649 否则case通过率为85.71% *

  • 负数最小值不管是否取负号是相等的。

    cout<<(-(0x7FFFFFFF + 1) == (0x7FFFFFFF + 1)) <<endl;  // 1
  • 完整代码,我觉得思路很清晰。

    class Solution {
    public:
      int StrToInt(string str) {
          int res = 0;
          int len = str.size();
          int index = 0;         //str索引
          int flag = true;       //默认为正数
          // 处理空格
          while(str[index] == ' ')
              index++;
          // 处理首位
          if(str[index] == '+')
              flag = true;
          else if(str[index] == '-')
              flag = false;
          else if(str[index] >= '0' && str[index] <= '9')
              res += str[index] & 0xF; // ASCII,等价于 - '0'操作
          else
              return 0;
          index++;
          // 接着处理
          while(index < len){
              if(!(str[index] >= '0' && str[index] <= '9'))
                  return 0;
              char tmp = str[index] - '0';
              if(index + 1 == len) // 边界情况!!!
                  if (res > 0 && (res * 10 + 7 == 0x7FFFFFFF))
                      if((flag && tmp > 7) || (!flag && tmp > 8))
                          return 0;
              res = (res<<1) + (res<<3) + tmp; // 左移1位相当于×2
              index++;
          }
          return flag? res: -res;
      }
    };
全部评论
??这题你用C++过了吗? AC不了呀 就是85%那个测试点过不了
点赞 回复 分享
发布于 2020-04-28 20:27
返回类型是int,不可能出现-2147483649的。
点赞 回复 分享
发布于 2020-04-29 08:13

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务