全栈开发知识库

103.加一

题目

给定一个表示 大整数 的整数数组 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. 从数组的最后一位开始往前遍历。 2. 把当前位加 1:digits[i] = digits[i] + 1。 3. 如果加 1 后等于 10,说明需要进位:把当前位设为 0,然后继续向前遍历(下一位加 1)。 4. 如果加 1 后小于 10,说明没有进位,直接返回数组(因为后面的位不会再受影响)。 5. 如果遍历完整个数组都没有返回,说明所有位都是 9,发生了全进位(例如 999 → 1000)。此时需要在数组最前面插入一个 1,后面全是 0。

为什么这样可以? - 因为加 1 只会影响连续的若干个 9 以及它们前面的那一位。只要遇到一个不是 9 的位,加 1 后就不会产生进位,可以直接返回。 - 如果所有位都是 9,那么加 1 后所有位都变成 0,并在最前面加一个 1。

class Solution {
    fun plusOne(digits: IntArray): IntArray {
        // 从最低位开始遍历
        for (i in digits.lastIndex downTo 0) {
            // 当前位加1
            digits[i]++
            // 如果加1后等于10,需要进位
            if (digits[i] == 10) {
                digits[i] = 0  // 当前位置0
                // 继续循环,处理下一位
            } else {
                // 没有进位,直接返回
                return digits
            }
        }
        // 所有位都是9,发生了全进位
        val result = IntArray(digits.size + 1)
        result[0] = 1  // 第一位是1,后面全是0(默认值)
        return result
    }
}

复杂度

  • 时间复杂度: O(n),最坏情况遍历整个数组。
  • 空间复杂度: O(1)(不考虑返回的新数组)或 O(n)(全进位时需要新建数组)。


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
本页由 Markdown 自动渲染 · 共 628 篇笔记