题目:
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} 这一类情况时会出错。