题目:
力扣https://leetcode-cn.com/problems/plus-one/
题目描述:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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]
输入:digits=[9,9]
输出:[1,0,0]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
题解:
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
let i=digits.length-1;
while(i>-1){
if(digits[i]+1<10){
++digits[i];
break;
}
else {
digits[i]=0
--i;
}
}
if(digits[0]==0){
digits=[...Array.apply(null,{length:digits.length+1})].map(()=>{return '0'})
digits[0]=1
}
return digits
};
分析:
继续我的思路逆行,题目思路放回小学一年级学习加法,遇十进一;
[2,3,3]==>[2,3,4]
[2,3,9]==>[2,4,0]
[9,9,9]==>[1,0,0,0]
- 从个位开始计算,当个位+1小于10,则个位=个位+1,中断while即可;
- 当个位不小于10,个位=0,十位+1,当十位小于10,则十位=十位+1,中断while;
- 当十位不小于10 ,
- ...
- 一直到i==0时,若digits[i]+1<10,digits[i]=digits[i]+1,中断while;
- 否则digits[i]=0,i=i-1;此时while循环里,i>-1 不成立,循环结束。
- 若digits=[9,9,9],此时,经过转化的digits=[0,0,0]
- 若digits首位==0,则扩展digits的长度=digits.length+1,全部填充为0,此时digits=[0,0,0,0],然后修改digits[0]=1即可;