66. 加一

加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]

解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]

解释:输入数组表示数字 4321。

示例 3:

输入:digits = [9]
输出:[1,0]

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

class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            digits[i]++;  // 1. 将当前位的数字加一
            if (digits[i] == 10) {  // 2. 如果加一后结果为 10
                digits[i] = 0;  // 将该位置为 0,并继续进位
            } else {
                return digits;  // 3. 如果没有进位,直接返回结果
            }
        }
        
        // 4. 如果循环结束,说明原数的每一位都产生了进位
        digits = new int[digits.length + 1];  // 5. 创建一个新的数组,长度比原数组多一位
        digits[0] = 1;  // 6. 新数组的第一个元素置为 1,其它位置自然是 0
        return digits;  // 7. 返回新的数组
    }
}

代码步骤解析

  1. 从末尾开始遍历
    • 我们从 digits 数组的最后一位(即最低位)开始逐步处理。这是因为我们要模拟加法操作,从个位开始加。
  2. 加一操作
    • digits[i]++ 将当前位的值加 1。如果加一后该位的值变为 10(即发生了进位),我们将当前位设置为 0,并继续处理上一位(即进位)。这就是通过 digits[i] = 0 来模拟进位。
  3. 判断是否有进位
    • 如果当前位加 1 后不等于 10(即没有进位),说明加法完成了,直接返回结果。
  4. 处理所有位都进位的情况
    • 如果遍历到最后一位仍然发生了进位(即每一位都变成了 0),那么我们需要在最前面新增一个 1,并将其余位设置为 0。这时就需要创建一个新的数组,长度比原数组多一位,并将 1 放在数组的最前面。
posted @ 2024-12-18 21:53  Drunker•L  阅读(1)  评论(0编辑  收藏  举报