一、题目描述
示例:
二、解题思路
① 一开始想过把元素变成一个整数,在对整数加一,但当数组的长度增加时,会超过整型变量的表示范围,所以不能使用这个方法。
② 对最后一个数加一,逆向遍历数组,如果某一位得到10,就对前一位加一。这里涉及一个难点是,数组可能要扩展。
数组的扩展,可以声明新的引用指向一个长度为length+1的新数组,第0位赋值1,再按顺序把原数组复制过去。
但是,考虑到发生数组扩展的情况,一定是100000这样的情形,所以可以直接使digits这个引用指向一个新的长度为length+1的数组,(数组默认每一位都是0),再把第0位赋值1即可。
这个方法的代码是能通过的。
class Solution {
public int[] plusOne(int[] digits) {
int length = digits.length;
if (length == 0)
return digits;
digits[length - 1]++;
for(int i = length - 1; i >= 0; i--){
if (digits[i] == 10){
digits[i] = 0;
if(i != 0){
digits[i - 1]++;
}
else{
digits = new int[length + 1];
digits[0] = 1;
return digits;
}
}
else
break;
}
return digits;
}
}
③进一步,其实发生数组需要拓展的情况非常特殊,只有所有元素都是9时才会发生。所以,从最后一位开始,对每一位都进行自增和对10取余的处理,这样既把最后位+1的效果体现出来,又可以在不进位时尽早结束程序。
(分析:最后一位+1,如果%10不为0,直接结束程序。如果为0,则需要进位,而下一次循环时正好对下一位+1,相当于完成了这次进一。
看到这里,如果对每一位都有自增操作还有疑问的话,这样理解:如果能对某一位进行处理,一定是发生进位了,需要加一。)
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length;
for(int i = len - 1; i >= 0; i--) {
digits[i]++;
digits[i] %= 10;
if(digits[i]!=0)
return digits;
}
digits = new int[len + 1];
digits[0] = 1;
return digits;
}
}
跳出for循环后,若程序还没有结束,说明发生了999->1000这样的情况。
三、编程实现
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length;
for(int i = len - 1; i >= 0; i--) {
digits[i]++;
digits[i] %= 10;
if(digits[i]!=0)
return digits;
}
digits = new int[len + 1];
digits[0] = 1;
return digits;
}
}