题目
题目来源:力扣(LeetCode)
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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]
思路分析
理解题意
- 数组是非空的,且每个数组元素都是非负的
- 每个数组元素的取值在 0~9之间
- 我们要返回一个数组让其是原数组的最后一位加上1
加一的结果可能会有 3 中情况
- 数组长度不变,数组最后一位元素加一且不需要进一位,如:123 + 1 = 124;
- 数组长度不变,数组最后一位元素加一且需要进一位,如 129 + 1 = 130;
- 数组长度发生变化,长度需要加一位,数组最后一位元素加一且需要进一位,如99 + 1 = 100;
解法
- 递归
- 从后往前递归遍历数组元素;
- 先让数组最后一个元素 +1,若不等于10则在此基础上 +1 并 return,反之则保留个位并进一,再判断倒数第二位元素 +1 是否等于10,以此类推;
- 我们只需要判断 digits[i] + 1 是否等于0,若等于则传入倒数第二个下标进入递归,直到 digits[i] + 1 !== 10 || i == -1结束递归。
/**
* @param {number[]} digits
* @return {number[]}
*/
// 用算法模拟加1往前是否进位的操作逻辑
var plusOne = function (digits) {
// 找到当前数组的最后一个元素的下标
let index = digits.length - 1;
// 进入递归,传入数组,和数组的倒数第一个数
addOne(digits, index);
return digits;
};
function addOne(arr, index) {
// 如果数组的第一位+1,也等于10,在数组的头部插入1;例子:99+1= 100
if (index === -1) return arr.unshift(1);
// 当前个位 +1 等于10 往前进一位,个位等于0; 例子:129+1= 130
if (arr[index] + 1 === 10) {
arr[index] = 0;
addOne(arr, index - 1)
} else { //加完1 不等于10,照常加1 返回; 例子:123+1=124
arr[index] += 1;
return arr;
}
}
- 迭代
```javascript
/**
- @param {number[]} digits
- @return {number[]}
*/
var plusOne = function(digits) {
const len = digits.length;
for(let i = len - 1; i >= 0; i—) {
} // 末位有进位,并且一直进位到最前方导致结果多出一位 digits = […Array(len + 1)].map(_=>0);; digits[0] = 1; return digits; };digits[i]++;
digits[i] %= 10;
if(digits[i]!=0) return digits;
```