LeetCode力扣每日一题(Java)66、加一

发布时间:2023年12月18日

每日一题在昨天断开了一天,是因为作者沉迷吉他,无法自拔……竟然把每日一题给忘了,所以今天,发两篇每日一题,把昨天的给补上

一、题目

二、解题思路

1、我的思路

其实乍一看这道题还是比较简单的,就是让数组的最后一个元素加1

但是再仔细想想就不难考虑到一种更加麻烦的情况——进位

如果一个数以9结尾,那么就需要将最后一位置为0,倒数第二位加1,但是如果倒数第二位也是9呢?就需要重复上述操作,将倒数第二位置为0,倒数第三位加1,但是如果倒数第三位也是9呢?如果这个数是1999999999怎么办?我只想说:禁止套娃

想到这里,我的脑海里浮现了一个思路:

将可能的情况分为3种:

1、数组中只有0:直接返回1

2、数组最后一位不是9:直接让最后一位加1,再返回原数组

3、数组最后一位是9:从后往前遍历数组,将值为9的元素全置为0,找到最靠后的一个不为9的元素时,让这个元素加1,结束循环,返回原数组

于是我写了如下代码

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

但这段代码却没有通过所有的测试用例,原因是我遗漏了一种情况,如果数字是999,这就意味着遍历数组将找不到值不为9的元素,按照我的代码走一遍,最后返回的结果是000,而预期结果是1000,也就是说,我们还要加入一段代码:在找不到值不为9的元素时,数组长度加1用于存放多余的1

于是我改进了代码

if(digits[0] == 0){
            return new int[] {1};
        }else if(digits[digits.length - 1] != 9){
            digits[digits.length - 1]++;
            return digits;
        }else{
            int i;
            for (i = digits.length-1; i >= 0 ; i--) {
                if(digits[i] != 9){
                    digits[i]++;
                    break;
                }else{
                    digits[i] = 0;
                }
            }
            if(i == -1){
                int[] arr = new int[digits.length+1];
                arr[0] = 1;
                return arr;
            }
            return digits;
        }

这里有一个小知识点:

由于我们使用的是数组的动态初始化,也就是初始化时只指定数组长度,由系统自动分配初始值,而整数类型的默认初始值是0,所以我们只需要把第一位置为1,在直接返回该数组即可

2、官方题解

官方题解和我的思路是一样的,只是代码略有不同

int n = digits.length;
        for (int i = n - 1; i >= 0; --i) {
            if (digits[i] != 9) {
                ++digits[i];
                for (int j = i + 1; j < n; ++j) {
                    digits[j] = 0;
                }
                return digits;
            }
        }

        // digits 中所有的元素均为 9
        int[] ans = new int[n + 1];
        ans[0] = 1;
        return ans;

3、经验分享

其实在写这篇博客之前,我的脑海里是没有完整的思路的,但是当我在博客里分析完题目之后,很快就有思路了,所以大家遇到题目,先不要着急给自己定义:好难、我想不出来等等这些标签,先冷静地分析题目,慢慢地想,可能一开始会思维不严谨、可能会遗漏情况,但是发现问题之后再改进代码也来得及,总比你不动手敲要好吧~

文章来源:https://blog.csdn.net/lbcbjtlhmjq/article/details/134986490
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。