LeetCode 66 Plus One (Tag:Array Difficulty:Easy)

260 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见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]

链接:leetcode-cn.com/problems/pl…

题解

这道题其实就是模拟加法, 主要有以下几个要点:

  1. 用一个变量表示进位, 我们代码里用 add 变量来作为进位, 初始话为 1, 表示初始要加的数字

  2. 从数组最后一个元素向前遍历, 因为最后一位数为个位数. 然后计算对应位上的数和进位的和, 该和除以 10 的余数为新数字对应位数的数字, 商为新的进位 add, 然后重复向前遍历

  3. 当遍历到第一个元素时, 会有两种情况, 一种是进位 add 为 0 的情况, 表示加了 1 之后, 对应数字的位数没有变化, 这时候直接返回结果数组即可, 比如实例中的几个数组; 另一种情况是进位不为 0, 因为本题只是加 1, 所以 add 不为 0 时, 一定为 1, 这时候原来的数字位数要变大一位, 比如 [9], 加 1 之后要变为 [1, 0], 所以对应这种情况要在结果数组的最前面增加一个元素 1.

具体代码见下方.

时间复杂度为 O(n), 空间复杂度为 O(1), 要注意的是我们结果也保存在了 digits 数组里.

/**
 * @param {number[]} digits
 * @return {number[]}
 */
var plusOne = function(digits) {
    // 进位
    let add = 1
    let i  = digits.length - 1
    while (i >= 0) {
        if (add > 0) {
            const sum = digits[i] + add
            digits[i] = sum % 10
            add = Math.floor(sum / 10)
        } 
        --i
    }
    // 遍历结束时,进位不为0 
    if (add > 0) digits.unshift(1)
    
    return digits
};