一 题目描述
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。
二 解题思路
从尾部开始遍历,每次都将该索引加+1,假设该索引所对应的值大于9(或者等于10),则继续遍历,否则直接返回
关键一步是,首部如果大于9,这时候需要构建一个数组的长度比原数组的长度大1的,首索引对应的值为1,其他索引=原数组索引-1;
三 代码实战
public static int[] plusOne(int[] digits) {
if(digits.length<1){
return digits;
}
for (int i=digits.length-1;i>=0;i--){
digits[i]++;
if(digits[i]==10){
digits[i]=0;
}else {
return digits;
}
}
int [] newDigits = new int[digits.length+1];
newDigits[0]=1;
for(int i=0;i<digits.length;i++){
newDigits[i+1]=digits[i];
}
return newDigits;
四 优化点
其实需要产生的新的数组只有一种情况,就是【9,9,9,9】,而如果产生了,其新的数组是【1,0,0,0,0】,所以我们可以判断所对应的值是否小于9,如果小于9,则该索引所对应的值加1后,直接返回,否则,该索引所对应的值为0,依次类推,代码实例如下:
public static int[] plusOne(int[] digits) {
for(int i = digits.length - 1; i >= 0; i--){
if (digits[i] < 9){
digits[i] ++;
return digits;
}
digits[i] = 0;
}
int[] nums = new int[digits.length + 1];
nums[0] = 1;
return nums;
}