leetcode算法66. 加一

126 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

一、题目描述:

66. 加一 - 力扣(LeetCode) (leetcode-cn.com)

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

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

你可以假设除了整数 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,导致数组越界,所以,需要加一些特殊的判断。

三、AC 代码:

class Solution {
    public int[] plusOne(int[] digits) {
        int carry = 1; 
        for (int i = digits.length - 1; i >= 0; i--) {
            int v = digits[i] + carry;
            if (v == 10) {
                digits[i] = 0;
                carry = 1;
            } else {
                digits[i] = v;
                carry = 0;
                break;
            }
        }

        if (carry == 0) {
            return digits;
        }

        int[] newDigits = new int[digits.length + 1];
        newDigits[0] = 1;
        for (int i = 0; i < digits.length; i++) {
            newDigits[1 + i] = digits[i];
        }
        return newDigits;
    }
}

四、总结:

虽然是解出来了,但是我们还有优化的空间,其实,我们深入思考一下,什么情况下才有进位呢?

其实,只有当后面有连续的 9 的时候才会发生进位,因此,我们可以遍历的时候遇到后面连续的 9 就把它们改成 0, 直到遇到一个不是 9 的数,就可以返回了,当然,也是要特殊处理全部都是 9 的情况。

范文参考:

66. 加一 题解 - 力扣(LeetCode) (leetcode-cn.com)

Java 数学解题 - 加一 - 力扣(LeetCode) (leetcode-cn.com)