一、题目描述 示例: 二、解题思路 ① 一开始想过把元素变成一个整数,在对整数加一,但当数组的长度增加时,会超过整型变量的表示范围,所以不能使用这个方法。 ② 对最后一个数加一,逆向遍历数组,如果某一位得到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,如果不为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; } }