Given a non-negative number represented as an array of digits, plus one to the number.
The digits are stored such that the most significant digit is at the head of the list.
題意解析:
這題就是給你一個數字,讓你加一,只不過數字是用數組形式給的,數組每個元素儲存一位,下標越小位越高。
很簡單,我第一個想到的就是正常做法。設置一個進位,只有一種特殊情況需要考慮,就是全是9的情況,這樣加一會導致數組大小要+1,分開考慮就行,代碼如下:
public class Solution {
public int[] plusOne(int[] digits) {
int carry = 0;
for(int i = 0, j = digits.length - 1; i <= digits.length / 2; i++, j--){
if(digits[i] == 9 && digits[j] == 9){
carry = 1;
}else{
carry = 0;
break;
}
}
if(carry == 1){
int[] result = new int[digits.length + 1];
result[0] = 1;
return result;
}
digits[digits.length - 1]++;
for(int i = digits.length - 1; i >= 0; i--){
digits[i] += carry;
if(digits[i] == 10){
digits[i] = 0;
carry = 1;
}else{
carry = 0;
}
}
return digits;
}
}
可以看見時間已經是最快的了。如果你不想像我這樣一開始就考慮特殊情況,你也可以這麼做:
public class Solution {
public int[] plusOne(int[] digits) {
int carry = 1;
for(int i = digits.length - 1; i >= 0 && carry != 0; --i){
digits[i] += carry;
carry = digits[i] / 10;
digits[i] = digits[i] % 10;
}
if(carry == 0)
return digits;
int[] result = new int[digits.length + 1];
result[0] = 1;
for(int i = 0; i < digits.length; ++i){
result[i + 1] = digits[i];
}
return result;
}
}
算到最後有進位就新建一個數組。
速度慢了一點呢。其實差不多的。和測試數據的分佈有關。