[LC] 66. Plus One

来源:互联网 发布:知英日剧 编辑:程序博客网 时间:2024/05/16 02:09

一、问题描述

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。。。)


五、碎碎念

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