【每日刷题】加一

发布于:2025-07-12 ⋅ 阅读:(17) ⋅ 点赞:(0)

66. 加一 - 力扣(LeetCode)

方法一

这版是自己的AC代码,记录一下。

首先用flag表示此刻是否有进位(当前位是否需要+1),初始置true。先假设最后答案数组位数与原数组位数相同,如果flag为真,说明当前位需要+1,即 res[i] = digits[i] + 1 ,如果+1后 res[i] == 10 ,说明需要进位,把res[i]置为0,flag置为true。否则res[i]不需要有变化,flag置为false。

最后判断结束后flag。如果为false直接返回res就可以了。但如果依然为true就说明一直都有进位,就是9999这种数。最开始我在if(flag)里面添加了每一位赋值的操作,让 newRes[i+1] = res[i] 。后面看了别人的题解,反应过来如果flag为真,说明答案是100000这种,末尾肯定都是0。所以直接给newRes[0]赋值为1即可,其它位都是初始化的0,就可以直接返回了。

class Solution {
    public int[] plusOne(int[] digits) {
        int len = digits.length;
        boolean flag = true;
        int res[] = new int[len];
        for(int i = len - 1; i >= 0; i--) {
            if(flag) {
                res[i] = digits[i] + 1;
                if(res[i] == 10){
                    res[i] = 0;
                    flag = true;
                } else{
                    flag = false;
                }
            } else {
                res[i] = digits[i];
            }
        }
        
        if(flag) {
            int newRes[] = new int[len + 1];
            newRes[0] = 1;
            return newRes;
        } else{
            return res;
        }
    }
}

方法二

评论区找到的最满意的一版题解。

直接判断加1前digits[i]是否为9,是的话就让它为0,继续循环。如果不为9,这里加上1后就可以结束了,直接返回digits数组。如果for循环结束还没有返回,说明给的数是9999这种一直走的if语句,那么就给数组扩容1个数并且重新初始化,把首位置为1,返回即可。

class Solution {
    public int[] plusOne(int[] digits) {
        int len = digits.length;
        for(int i = len - 1; i >= 0; i--) {
            if(digits[i] == 9) {
                digits[i] = 0;
            } else{
                digits[i]++;
                return digits;
            }
        }
        
        digits = new int[len + 1];
        digits[0] = 1;
        return digits;
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到