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 <= 1000 <= digits[i] <= 9
2、思路🧠
可能有些小伙伴没有明白题目意思,再次阅读题目,没错就是加一,因为只加一的所以可能出现的情况就只有两种:
- 数字9加一,需要进位
- 除数字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)
4、总结
该题目的对特殊情况的判断,明白数字加 1 可能要出现进位的情况,也可能出现进位之后,数组越界,需要重新定义一个新的数组,来完成题目的要求。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!