LeetCode66题:加一,JS解法(最简单解法)

这道题目其实没什么好说的,无非就是三种情况,但是看到以下解法的我感觉自己在写的时候简直是笨蛋,哈哈哈,直接来看吧

示例很简单,就是给数组末位加一,在这里一共是三种情况:

1. 末位直接+1

2. 带有9的位数,有进位

3. 类似于99,9999999这样都是9,加1后还需要扩充一位,变成100,10000000这样的数。

我第一次想的是,遍历判断末位是否为9,如果为9,加1为0,进位。

但是,由于这道题的限制,所以,只有从后向前,从末位开始,连续的9才需要进位,一但不连续,就不会进位。

所以,情况变简单了,直接在循环里判断即可。

我当时没有想到,还在循环里加条件,然而它太复杂了

直接来看精简版吧!

注意,为了保证遍历的顺序与数字进位的顺序一样,都为从右向左,所以应该从后向前遍历

我第一次做这种题的时候,真的惯性思维去从前向后遍历了......,然而能做,但是难度剧增。

先遍历数组,在这里,第一次遍历就可以判断出末位是否为9,不是的话,末位加一,并返回整个数组 。

在这里就返回,是不是很妙!直接就把第一种个情况做完返回了。

然后我们就来搞定第二种情况,在这里只需要将当前位直接变为0,就可以放整个数组进入下一轮循环。

你要是问我,欸,进位呢??细细品,下一轮循环,下标的定位就是在它的前一位,如果不是9,那就加一并返回数组,这里就进行了进位,妙哉!

上代码!

for(let i=digits.length-1;i>=0;i--){
            if(digits[i]!==9){
                digits[i]++;
                return digits
            }
            else{
                //在这里并不需要对前一位加一,因为它是向前遍历的前面一位会自己加一
                digits[i]=0;
                
            }
        }

考虑这样遍历下来,还没有被返回走的数组,是什么情况?

没错,它们的每一位,都走的是else,没有走if,所以,他们都是被赋值为0的,看,这不就是第三种情况,全是0,我们只需要在前面加个1就行了。

我当时在做的时候,想着这里需要先遍历判断是否都是0,但是不用,直接给数组前面加1就可以 ,理解不了的话,仔细品品前面的return。

 const result=[1,...digits]
        return result

一拼接,就完事了!

上完整的函数吧!

var plusOne = function(digits) {
        for(let i=digits.length-1;i>=0;i--){
            if(digits[i]!==9){
                digits[i]++;
                return digits
            }
            else{
                //在这里并不需要对前一位加一,因为它是向前遍历的前面一位会自己加一
                digits[i]=0;
                
            }
        }
        
        const result=[1,...digits]
        return result
};

唉,感觉自己就是笨憨憨,这道题很有意思,可能这就是算法的乐趣,get到一个小点都觉得很有意思!

还有更好的解法可以留言讨论哦!

猜你喜欢

转载自blog.csdn.net/weixin_42309926/article/details/108190415