題目:
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} 這一類情況時會出錯。