[LC] 66. Plus One

一、问题描述

Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.

You may assume the integer do not contain any leading zero, except the number 0 itself.

The digits are stored such that the most significant digit is at the head of the list.


二、我的思路

就像列竖式做加法一样,一个int add记录当前位是否要加,如果add位是0的话,就停止加法。

代码如下,在最高位进位的地方借鉴了discuss里的技巧:

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


三、淫奇技巧

1)

public int[] plusOne(int[] digits) {
    for (int i = digits.length - 1; i >=0; i--) {
        if (digits[i] != 9) {
            digits[i]++;
            break;
        } else {
            digits[i] = 0;
        }
    }
    if (digits[0] == 0) {
        int[] res = new int[digits.length+1];
        res[0] = 1;
        return res;
    }
    return digits;
}
很好的利用了题目假设。题目假设最高位不会是0,除非这个数就是0。

在做完加法以后,判断最高位是否进位了。如果最高位是0,说明之前这个数是9999...9, 加一以后后面的数字全部是0. 所以只需要在最高位补1即可。

另外相比我的加法计算方法,人家写的太简洁了!!

2)和上面的相同的思路,不过更绝~

public int[] plusOne(int[] digits) {
        
    int n = digits.length;
    for(int i=n-1; i>=0; i--) {
        if(digits[i] < 9) {
            digits[i]++;
            return digits;
        }
        
        digits[i] = 0;
    }
    
    int[] newNumber = new int [n+1];
    newNumber[0] = 1;
    
    return newNumber;
}

四、举一反三

如果不是加1而是加n呢?加法运算部分if判断条件也要改变一下。最后的淫奇技巧就不能用了。是否可以改变下条件继续神奇呢?如果动态调整的话怎么办呢?(to be continued。。。)


五、碎碎念

简单的题目,还是能看出很大的差距呀~继续加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值