【一刷《剑指Offer》】面试题 49(案例):把字符串转换成整数

力扣对应题目链接:8. 字符串转换整数 (atoi) - 力扣(LeetCode)


一、《剑指Offer》对应内容


二、分析题目

根据题意,有以下四种字符需要考虑:

  1. 首部空格: 删除之即可。
  2. 符号位: 三种情况,即 ''+''、''−''、''无符号"。新建一个变量保存符号位,返回前判断正负即可。
  3. 非数字字符: 遇到首个非数字的字符时,应立即返回。
  4. 数字字符:
  • 字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可。
  • 数字拼接: 若从左向右遍历数字,设当前位字符为 ch,当前位数字为 x,数字结果为 res,则数字拼接公式为:

res = 10×res + x

x = ascii(ch)−ascii(′0′)

数字越界处理:

题目要求返回的数值范围应在 [−2^31, 2^(31−1)] ,因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 res 在 int 类型的取值范围内。

在每轮数字拼接前,判断 res 在此轮拼接后是否超过 INT_MAX(2147483647),若超过则加上符号位直接返回。

  1. res > INT_MAX / 10         情况一:执行拼接 10×res ≥ 2147483650 越界
  2. res = INT_MAX / 10, x>7  情况二:拼接后是 2147483648 或 2147483649 越界


三、代码

class Solution {
public:
    int myAtoi(string s) {
        int n=s.size();
        if(n==0) return 0;
        int res=0;
        int sign=1;
        int i=0;
        while(s[i]==' ')
        {
            i++;
            if(i==n) return 0;
        }
        if(s[i]=='-')
        {
            sign=-1;
            i++;
        }
        else if(s[i]=='+') i++;
        for(int j=i; j<n; j++)
        {
            if(s[j]<'0' || s[j]>'9') break;
            if(res>INT_MAX/10 || (res==INT_MAX/10 && s[j]>'7'))
            {
                if(sign==1) return INT_MAX;
                else return INT_MIN;
            }
            res=res*10+(s[j]-'0');
        }
        return sign*res;
    }
};

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 03:18:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 03:18:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 03:18:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 03:18:02       55 阅读

热门阅读

  1. HarmonyOS NEXT零基础入门到实战-第三部分

    2024-07-22 03:18:02       13 阅读
  2. 计算机网络之TCP/IP协议栈

    2024-07-22 03:18:02       18 阅读
  3. GitHub每日最火火火项目(7.21)

    2024-07-22 03:18:02       18 阅读
  4. 【HTML】基础用法

    2024-07-22 03:18:02       17 阅读
  5. 今日总结:雪花算法,拉取在线用户

    2024-07-22 03:18:02       19 阅读
  6. qt QScrollArea 可滚动区域控件简单举例

    2024-07-22 03:18:02       19 阅读
  7. JDK 内置的基本注解类型

    2024-07-22 03:18:02       17 阅读