Leetcode 66. 加一

150 阅读2分钟

Leetcode 66. 加一

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1、题目📑

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

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

你可以假设除了整数 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

2、思路🧠

可能有些小伙伴没有明白题目意思,再次阅读题目,没错就是加一,因为只加一的所以可能出现的情况就只有两种:

  1. 数字9加一,需要进位
  2. 除数字9之外的加一,不需要进位

分别进行考虑,数字为9加一进位,其该位置的数字为0,十位数字为1,并且进位的数字只能出现一种情况就是1这种情况,如果不出现进位的情况就结束运算。

所以需要判断是否出现了进位并模拟出进位方式,例如 十位数加 1 ,个位数置 0,循环直到判断到没有再进位就结束循环并返回结果。

这其中会出现一些特殊情况就是出现 9、9999、999999 之类的数字时,循环到最后也是需要进位,出现这种情况时,我们单独拉出来判断,手动给它进一位即可。

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

class Solution {
    public int[] plusOne(int[] digits) {
        for(int i = digits.length - 1;i >=0 ; i--){
            digits[i]++;
            digits[i] %= 10;
            if(digits[i] != 0) return digits;
        }
            digits = new int [digits.length + 1];
            digits[0] = 1;
            return digits;
    }
}

时间复杂度:O(N) 其中 N 是数组 digits 的长度。

空间复杂度:O(1)

第二次commit AC

public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            if (digits[i] == 9) {
                digits[i] = 0;
            } else {
                digits[i] += 1;
                return digits;
            }

        }
        //所有位都是进位,则长度+1 例如 999-1000
        digits= new int[digits.length + 1];
        digits[0] = 1;
        return digits;
    }

时间复杂度:O(N) 其中 N 是数组 digits 的长度。

空间复杂度:O(1)

image-20220316195143776

4、总结

该题目的对特殊情况的判断,明白数字加 1 可能要出现进位的情况,也可能出现进位之后,数组越界,需要重新定义一个新的数组,来完成题目的要求。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:66. 加一 - 力扣(LeetCode)