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

题目

原题链接:LeetCode 8. 字符串转换整数 (atoi)

思路

题目首先要判断空格。将前面的空格先一个个扣除。扣完空格记得判断是否到达字符串末尾。
然后判断符号。用一个int存符号,正数为1,负数为-1。
接下来题目又说前置零又说非数字字符又说数字,理一下思路,其实就是判断是否是数字,是数字就进行转换。
转换数字仍然用 r = r * 10 + x,x从数字首位开始,就算有前置0也没关系。
因为题目可能要求不超过int范围,这里自己写不用long long存。用int,当然就要判断int范围了。
y总题解,中没有带着正负号去判断,他假设res一直为正,最后加上符号,那么以res为正的前提下去判断有没有超出负数范围就需要特判了,因为[-2147483648,2147483647],正负两个最大值最小值的绝对值是不一样的,最好是带着符合去判断,这样不需特判。

需要注意要将res * 10 + x > Integer.MAX_VALUE的判断转化成res > (Integer.MAX_VALUE - x) / 10,否则计算过程会超出int范围。

需要注意 x = s.charAt(index) - '0'需要先提前算出来,否则(Integer.MAX_VALUE - x)(Integer.MIN_VALUE - x)可能超出int范围。比如int最大是10,如果6 + 4计算过程中不会超,而6 + 6 - 2 + 4过程中就会超出范围。

代码

class Solution {
    public int myAtoi(String s)
    {
        // 先处理空格
        int index = 0;
        while(index < s.length() && s.charAt(index) == ' ') index ++;
        if (index == s.length()) return 0;
        // 判断正负号
        int fuhao = 1;
        if (s.charAt(index) == '+') index ++;
        else if (s.charAt(index) == '-')
        {
            fuhao = -1;
            index ++;
        }
        // 开始循环持续判断是否为数字
        int res = 0;
        while (index < s.length() && s.charAt(index) >= '0' && s.charAt(index) <= '9')
        {
            // 如果为数字,就分正负开始累加
            // 先将x拿出来防止超int范围
            int x = s.charAt(index) - '0';
            if (fuhao == 1) {
                if (res > (Integer.MAX_VALUE - x) / 10) return Integer.MAX_VALUE;
                res = res * 10 + x;
            } else {
                x = fuhao * x;
                if (res < (Integer.MIN_VALUE - x) / 10) return Integer.MIN_VALUE;
                res = res * 10 + x;
            }
            index ++;
        }
        return res;
    }
}
posted @   r涤生  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示