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的情况需要把数组开大一位外均不需要变动数组大小,所以将这种情况单独考虑即可。
Source1
public class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length - 1;
int[] a = new int[len + 1];
int[] b = new int[len + 2]; //新开一个数组存放a长度存不下的有进位的数组
int carry = 0;
a[len] = (digits[len] + 1) % 10;
carry = (digits[len] + 1) / 10;
len --;
while(len >= 0){
a[len] = (digits[len] + carry) % 10;
carry = (digits[len] + carry) / 10;
len -- ;
}
b[0] = 1;
if(carry == 1){ //digits各位数均是9的情况
System.arraycopy(a, 0, b, 1, len + 1); //源数组,拷贝开始位置,目的数组,目的放置位置,拷贝长度
return b;
}
else return a;
}
}
Test
public static void main(String[] args){
int[] a = {9,9,9};
int[] b = new Solution().plusOne(a);
for(int i = 0 ; i < b.length ; i++)
System.out.print(b[i]); //数组的打印要逐个打 如果直接在print里面写数组 会打印首地址
}
Source2
public class Solution {
public int[] plusOne(int[] digits) {
int n = digits.length;
int flag = 1;
int carry = 0;
for(int i = n - 1; i >= 0; i--){
if(digits[i] != 9){
flag = 0;
break;
}
}
if(flag == 1){
int[] res = new int[n + 1];
res[0] = 1;
for(int i = 1; i < n + 1; i++){
res[i] = 0;
}
return res;
}
else{
int[] res = new int[n];
res[n - 1] = (digits[n - 1] + 1) % 10;
carry = (digits[n - 1] + 1) / 10;
for(int i = n - 2; i >= 0; i--){
res[i] = (digits[i] + carry) % 10;
carry = (digits[i] + carry) / 10;
}
return res;
}
}
}