给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
思路
1 末位小于9,直接+1就可以返回数组
2 末位==9,本位置0。
2.1如果前面还有数组,数换成新数组继续递归
2.2如果前面没有元素了,就创建新的数组,[0]元素为1
然后我吐了我的代码是错的,到digits3不知道怎么整,用例:[9,9]去调用总是只返回[1,0]
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length;
int last = len-1; //最后一个元素位置
//直接最高位+1,先判断是否为9
if(digits[last] < 9){ //小于9 直接+1后返回
digits[last] += 1;
return digits;
}else{ //9,递归, if(digits[last] == 9)
digits[last] = 0; //本位置0,
if(last-1 > -1 ){ //1 有前一位,就递归
//前一位递归
int[] preArray = new int[last];
for(int i=0;i<last;i++){ //给新数组赋值
preArray[i] = digits[i];
}
//再调用自己
int[] digits3 = new int[len+1];
int digits3len= digits3.length;
digits3 = plusOne(preArray);
// digits3[digits3len-1]=0;
// for(int j=0;j<last;j++){
// digits[j] = digits3[j];
// }
return digits3;
}else{ //2 没有前一位,就创建。
int[] digits2 = new int[len+1];
digits2[0] = 1; //最高位直接赋值1
//后面的照搬原来的数
for(int k=1;k<len;k++){
digits2[k] = digits[k];
}
return digits2;
}
}
}
}
再看看别人的代码:
末位无进位,则末位加一即可,因为末位无进位,前面也不可能产生进位,比如 45 => 46
末位有进位,在中间位置进位停止,则需要找到进位的典型标志,即为当前位 %10后为 0,则前一位加 1,直到不为 0 为止,比如 499 => 500
末位有进位,并且一直进位到最前方导致结果多出一位,对于这种情况,需要在第 2 种情况遍历结束的基础上,进行单独处理,比如 999 => 1000
作者:guanpengchn
链接:https://leetcode-cn.com/problems/plus-one/solution/hua-jie-suan-fa-66-jia-yi-by-guanpengchn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length;
//从后往前遍历,即从个位开始
for(int i = len - 1; i >= 0; i--) {
digits[i]++; //对个位自增1
digits[i] %= 10; //自增以后对10取余
//如果余数不为0,即个位数没有进1,直接return了
if(digits[i]!=0)
return digits;
}
//否则就是有进位,需要一个更大的数组
digits = new int[len + 1];
digits[0] = 1;
return digits;
}
}