给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
(1)遍历法
1,从数组末尾开始反向遍历数组,看是否有进位;进位初始为1;
2,建立新数组,比原数组长度加1存放结果;互相对应位置为原数组当前位置加一;
3,遍历,如果有进位,也就是原数组当前位置数字为9,则将结果数组当前位置数置为0;否则没进位,那么就将原数组的当前位值加上进位值(开始时初始为1)存放到结果数组对应位置,并且将进位值置为0;(其实也就是从这个位置开始,后续只是将原数组的数放到了新数组中而已);
4,遍历完成,如果进位值为1,其实就是把结果数组的第一个数置为1,后续全部置为0,原数组是一个全为9组成的数组;如果进位值为0,那么,就将结果数组长度其实和原数组一样的,则将头一位截掉,复制后半段即可;
class Solution {
public int[] plusOne(int[] digits) {
//判断最高位是否等于10也就是有进位
int carry = 1;//表示是否有进位
//新建结果数组统计结果
int len = digits.length;
int[] res = new int[len+1];
//遍历数组,存到结果数组,层层判断是否有进位
for (int i = len; i > 0; i --) {
//判断有进位则前一位加一
if (digits[i-1]+carry >= 10)
//res当前位置的数字为0
res[i] = 0;
else{//否则全程没有进位(除了初始加1)
res[i] = digits[i-1] + carry;
carry = 0;
}
}
//如果遍历完成还有进位
if (carry == 1)
res[0] = 1;
else
//否则就将结果数组由1开始到完成复制一份即可
res = Arrays.copyOfRange(res,1,len+1);
return res;
}
}
注意:全是9的数组的特殊情况处理;
(2)递归法
1,全是9的数组也就是,递归到index==0,此时就需要新建结果数组,长度为原数组加1,并且将开头置为1即可;
2,当前位置上的数小于9,那就在原数组当前位置数值加一,然后返回原数组即可;
3,当前位置上的数字为9,并且index也不等与0,则继续向前递归即可,就是有进位的情况了;
class Solution {
public int[] plusOne(int[] digits) {
return add(digits, digits.length-1);
}
//递归
private int[] add(int[] digits, int index) {
//如果递归一直进行到index==0,说明原数组长度不够,并且第一个数需要进位,并且其余数肯定都是0;
if (index == 0 && digits[0] == 9) {
//需要新的空间存储
int[] res = new int[digits.length + 1];
//并且它的第一位是1,第二位是0
res[0] = 1;
return res;
}
//不存在进位则直接末尾数加一返回
if (digits[index]<9) {
digits[index] += 1;
return digits;
}
//要一直向前进位,则递归
else {
//当前位数置为0
digits[index] = 0;
return add(digits,index-1);
}
}
}