题目介绍:传入数组加一后返回
题目分析:正常加一没问题,特别的是满9进1要考虑两种情况,一种是非首位,非首位满9进1此位变0,高一位+1,如果出现59999这种情况,就要谨慎了;另一种情况是首位像999,数组需要扩容,然后原首位变0,新首位变1。
算法一:标准答案
public int[] plusOne(int[] digits) {
int n = digits.length;
//循环n次,从后往前
for(int i=n-1; i>=0; i--) {
if(digits[i] < 9) {
//当前值小于9,直接+1结束
digits[i]++;
return digits;
}
//不是9,此位变零后,循环,然后下一位要么小于9,加一;
//要么等于9变零;再不然,执行了n次,还是9,结束for循环,出去就是一个扩容,因为前面都是9进一变0
//所以只要在首位加1就可以了
digits[i] = 0;
}
//数组扩容,结果总是10000....
int[] newNumber = new int [n+1];
newNumber[0] = 1;
return newNumber;
}
算法二:处理首位9问题,用了copyof,但又不知道怎么在数组第一位插数据,只能再次for了。
public int[] plusOne(int[] digits) {
/*
* //判断首位是否为0, if(digits[0] == 0) { return digits; }
*/
int[] retult = digits;
//循环n次
for (int i = digits.length-1; i >= 0; i--) {
//尾数加1
digits[i] = digits[i] + 1;
if(digits[i]!=10) {
//不进一结,束
retult = digits;
return retult;
}else {
//进一,判断是否首位,是则数组扩容,此位变10变0,扩容为变1
if(i == 0) {
int[] array2 = Arrays.copyOf(digits, digits.length+1);
array2[0] = 1;array2[1] = 0;
for(int j = 2;j<array2.length;j++) {
array2[j] = digits[j-1];
}
retult = array2;
return retult;
}else {
digits[i] = 0;
}
}
}
return retult;
}
作者的话:算法一是leetcode讨论区的同学给出的,算法二自己写的,emmm...感觉写了好多多余的代码,总是直观的一步步根据流程写判断,算法一巧妙在于for循环结束返回10000....。
Ending