LeetCode高频题66. 加一,给你一个数组表示数字,则加1返回结果

LeetCode高频题66. 加一,给你一个数组表示数字,则加1返回结果

提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
在这里插入图片描述


题目

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/plus-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


一、审题

示例 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


二、解题

极其无聊的一个题
其实你大可不必把数组转int数字,直接在原来的数组上操作

我第一次见到这个题,还把数组变数字了
就是高位数字,不断乘10加低位数字
比如
在这里插入图片描述
这样会有问题的
很有可能int数字y会超过int表达的最大范围,溢出了

因此,你要把加法的本质搞懂了

就是低位一位一位地,加,发现有进位放到高位上去就行,我们直接在原来那个数组上操作就行

正常情况下,只有数字9才有必要+1进位得10
因此,你就从数组最低位开始加1,发现进位搞到上面去
在这里插入图片描述

其余的数字要是小于9,那压根不需要进位,直接加了1就返回数组本身
在这里插入图片描述

如果一直都是需要进位,最后数组还得多申请一个数字来,最高位是1,进位来的
在这里插入图片描述

这题绝对是闲得无聊
我们也不需要准备进位c
因为我们代码for循环就从数组的最低位,开始加1,即使你进位了,如果没有进位直接返回了
有进位,我们依然会到进位位置那去加1,这时候没有进位依然就直接返回了

手撕代码就过于容易了

        //复习:直接原来数组上操作,从低位开始加1,如果没有进位直接返回,否则把进位1加到高位
        public int[] plusOneReview(int[] digits) {
            if (digits == null || digits.length == 0) return null;
            if (digits.length == 1 && digits[0] == 0) return new int[] {1};

            int N = digits.length;
            //直接从数组的低位N-1位置开始,到高位0位置
            for (int i = N - 1; i >= 0; i--) {
                if (digits[i] < 9){
                    //不够9,那低位加了1无所谓,没有进位,直接返回了
                    digits[i] += 1;
                    return digits;//没有后续
                }
                //如果数字是9,9+1=10,i位置就变0了,下一次一定要让前面高位加1
                digits[i] = 0;
            }

            //如果不会提前返回,到这的话说明一直遇到了99999,还得进位,我们现在申请一个补上,其余位全是0
            int[] ans = new int[N + 1];
            ans[0] = 1;//最高位1,其余是0

            return ans;
        }

测试一把“:

    public static void test(){
        int[] arr = {1,2,3,9};
        Solution solution = new Solution();
        int[] res = solution.plusOneReview(arr);
        for (int i = 0; i < res.length; i++) {
            System.out.print(res[i] +" ");
        }
    }

    public static void main(String[] args) {
        test();
    }
1 2 4 0 

很OK

LeetCode测试;
在这里插入图片描述
在这里插入图片描述
反正不需要转数字
懂了进位往前加的道理就行


总结

提示:重要经验:

1)这是史上最简单的算法题了
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰露可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值