力扣第六十六题-加一

229 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

前言

力扣第六十六题 加一 如下所示:

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

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

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

示例 1:

输入: digits = [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

示例 2:

输入: digits = [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

一、思路

先理解一下题目中的意思:一个整数使用数组表示,高位在左,低位在右。然后将整数的值加一后依然使用数组来表示

既然是 加一,我们肯定要考虑到是否需要进位。当时进位也有两种情况:

  • 普通进位:如 [1, 2, 3] 经过 加一 后,结果为 [1, 2, 4]
  • 高位溢出:如 [9, 9, 9, 9] 经过 加一 后,数组需要扩容来处理高位溢出的情况,结果为 [1, 0, 0, 0, 0]

综上所述,实现的方式大致步骤为以下几个步骤:

  1. 将低位的值 加一,得到进位的值,和当前的值。例如 9 经过 加一 后,进位值为 1,当前的值为 0
  2. 从右至左遍历数组,当前的值为 进位值 + digits[i]。如果 i=0 时,仍需要进位,则扩容再将最高位置为 1 即可
  3. 反馈数组 digits

二、实现

实现代码与思路保持一致

实现代码

    public int[] plusOne(int[] digits) {
        int len = digits.length;
        int current = digits[len-1] + 1;   // 当前计数值
        int carry = current/10;    // 进位
        current = current - carry * 10;
        for (int i=len-1; i>-1; i--) {
            digits[i] = current;
            if (carry == 0) {
                break;
            }
            if (carry > 0 && i == 0) {  // 处理进位
                digits = new int[digits.length+1];
                digits[0] = 1;
                break;
            }
            current = digits[i-1] + carry;
            carry = current/10;
            current = current - carry * 10;
        }
        return digits;
    }

测试代码

    public static void main(String[] args) {
        int[] digits = {9, 9};
        new Number66().plusOne(digits);
    }

结果

image.png

三、总结

这一题值得说明的是:千万不要遍历数组得到整数的结果后,再转为数组。这样会有溢出的风险,勿用!

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~