LeetCode - 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[] digits = {a, b, c};  //其中a, b, c是int型

则其表示的大数为 c + b*10 + a*10的平方 。并且这里的a, b, c 可以是大于9的数字

例如,digits[3] = {2, 9, 36}; 那么结果为 326 (36 + 9*10 + 2*100),所以也可以写成 digits[3] = {3, 2, 6}。


思路与步骤:

先给最后一位加1,然后判断是否需要进位,同时一个位进位后可能会需要继续向更高位进位,所以用循环。

但是这里有个问题,默认digits[0] 最大为9,所以的最高位需要进位时只需要 新数组的第一个元素为1(而不需要上面说的digits[0]/10),后面的全为0即可。

另外看别人的代码,发现不只是digits[0] 最大为9,而是digits数组中的所有数字默认为不大于9,所以进位问题只需要考虑9+1后进1(而不用是digits[i]/10),而且当前位只需要是0即可。测试用例中不包含此外的情况。


编程实现:

public class Solution {
    public int[] plusOne(int[] digits) {
        int len = digits.length;
        digits[len-1]++;
        int i=len-1;
        for(; i>=0; i--){
            if(digits[i] < 10)  continue;
            else if(i-1 >= 0 && digits[i] >= 10){
                digits[i-1] += digits[i]/10;
                digits[i] -= (digits[i]/10)*10;
            } else break;
        }

        if(digits[0] >= 10){
            int[] newNumber = new int[len+1];
            newNumber[0] = digits[0]/10;
            return newNumber;
        } else return digits;
    }
}

别人的代码:

public class Solution {
    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;
    }
}

这个代码,当测试用例为{2, 9, 36} 这一类情况时会出错。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章