「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。
题目
链接:leetcode-cn.com/problems/pl…
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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 <= digits.length <= 1000 <= digits[i] <= 9
解题思路
思路1
从最后一位开始加1,先处理9的情况,如果是9,加1的位置要一直前移,直到最开始或者某个不为9的位。 找到最后一个加1不影响其他位的位置就停止。
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
let idx = digits.length - 1;
while(idx >= 0 && digits[idx] == 9)
digits[idx--] = 0;
if(idx >= 0){
digits[idx]++;
return digits;
}
digits.splice(0, 0, 1);
return digits;
};
思路2
倒序遍历,先将末尾提前+1,这样只需要判断后置位是否满足条件,往前进位不满足条件直接返回。
这里要特别考虑的点是当digits[0]即首位满足进位条件时,需要额外处理,这里js可以直接digits.unshift(1)
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
digits[digits.length - 1] ++
for(let i = digits.length - 1; i >= 0; i--){
if(digits[i] == 10){
digits[i] -= 10
if(i == 0){
digits.unshift(1)
}else{
digits[i - 1]++
}
}
else {
return digits
}
}
return digits
};
思路3
本题难点在于如何优雅的处理数据的进位。递归思想如下:定义一个指针指向当前数组尾数,分情况讨论。
- 若指针指向的当前数据小于9,使其加一,直接返回修改后的数据,程序结束
- 若指针指向的当前数据等于9,使其赋值为0,指针向前移动一位,再次执行1、2。 特殊情况:在2的情况下,若当前指针指向数组第0个数,在数组首位插入数字1。直接返回修改后的数据,程序结束。
/**
* @param {number[]} digits
* @return {number[]}
*/
function arrayBitCarry(array,position){
//若指针指向的当前数据小于9,使其加一,直接返回修改后的数据,程序结束
if(array[position]<9){
array[position] = array[position] + 1
return array
}else{
//若指针指向的当前数据等于9,使其赋值为0,指针向前移动一位,再次执行递归程序
array[position] = 0
if(position==0){
array.unshift(1)
return array
}
return arrayBitCarry(array,position-1)
}
}
var plusOne = function(digits) {
return arrayBitCarry(digits,digits.length-1)
};