「前端刷题」66. 加一

216 阅读2分钟

「这是我参与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 <= 100
  • 0 <= 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

本题难点在于如何优雅的处理数据的进位。递归思想如下:定义一个指针指向当前数组尾数,分情况讨论。

  1. 若指针指向的当前数据小于9,使其加一,直接返回修改后的数据,程序结束
  2. 若指针指向的当前数据等于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)
};