题目
这是一道简单的小题,自己却也没写出来。。。逆序遍历数组digits,用carry标记当前元素是否需要进位(=0不要,=1要)。
若carry=1,则当前元素要么置0,要么自加1。自加1之后,再也不需要进位。
求解思路
- 初始化
carry=1
表示是否需要进位,=1表示需进位,=0表示不进位。 - 令
i=digits.length-1
- 若
digits[i]==9
且carry=1
,则该元素置0; - 若
digits[i]!=9
且carry=1
,则该元素自加1,令carry=0
,i-=1
。 - 判断若
i>=0
,则转step3,否则step6; - 判断carry==1?,则进位。
写法1
public int[] plusOne(int[] digits) {
int carry = 1;
for (int i = digits.length - 1; i >= 0; i--) {
if (digits[i] == 9) {
if (carry == 1) {
digits[i] = 0;
}
} else {
if (carry == 1) {
digits[i] += 1;
}
carry = 0;
}
}
if (carry == 1) {
int[] temp = new int[digits.length + 1];
temp[0] = 1;
digits = temp;
}
return digits;
}
写法2
下面写法,这一句return digits
可太强了,简直是神来一笔。每次检查digits[i]
,若digits[i]==9
,则digits[i]=0
。若digits[i]!=9
,则令digits[i]+=1
,直接返回digits,跳出方法,原因是此后再也不需要进位。
public int[] plusOne2(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
//若当元素不是9,则该元素+1
if (digits[i] != 9) {
digits[i]++;
return digits;
}
//若当元素是9,则该元素重新置为0
digits[i] = 0;
}
//跳出for循环,说明数字全部是9
int[] temp = new int[digits.length + 1];
temp[0] = 1;
return temp;
}