JS算法练习-Day07-加一

34 阅读2分钟

题目:
给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0

将大整数加 1,并返回结果的数字数组。

示例 1:

输入: digits = [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
加 1 后得到 123 + 1 = 124。
因此,结果应该是 [1,2,4]

示例 2:

输入: digits = [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
加 1 后得到 4321 + 1 = 4322。
因此,结果应该是 [4,3,2,2]

示例 3:

输入: digits = [9]
输出: [1,0]
解释: 输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9
  • digits 不包含任何前导 0

我的实现:

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
    let arr = (BigInt(digits.join('')) + BigInt(1)).toString().split('')
    for(i = 0; i < arr.length; i++) {
        arr[i] = Number(arr[i])
    }
    return arr
};
  • 测试通过率100%
  • 但是当我写完之后就在想,这能算是一个算法吗,确实不算,这只能算是一个工程实现
  • 是一个有效的工程解决方案(适合实际开发),但作为算法练习,建议改用更底层的实现。算法题的核心价值在于训练基础逻辑能力,而非语言API的熟练度
  • 这个算法的核心应该是想让我去模拟加法进位的过程

算法分析:

  • 如果这个数字是1,那么+1就是2

  • 如果这个数字是2,那么+1就是3

  • 。。。。。

  • 如果这个数字是8,那么+1就是9

  • 如果这个数字是9,那么+1就是10,就相当于1 + 9 = 0,然后再拿进位的1去和前面相加

  • 写成代码就是下面这样了

    var plusOne = function(digits) {
        for(let i = 0; i < digits.length; i++) {
            if(digits[i] != 9) {
                ++digits[i]
                return digits
            }
            digits[i] = 0
        }
        return [1, ...digits]
    }
    

    哈哈哈,标准的错误答案,加法是从最后一位开始算的,我为什么要从第一位开始呢,正确的是下面这样

    var plusOne = function(digits) {
        for(let i = digits.length - 1; i >= 0; i--) {
            if(digits[i] != 9) {
                ++digits[i]
                return digits
            }
            digits[i] = 0
        }
        return [1, ...digits]
    }
    

    人菜又爱玩,希望能让我这生锈的脑子,再转动转动。。。