这道题目其实没什么好说的,无非就是三种情况,但是看到以下解法的我感觉自己在写的时候简直是笨蛋,哈哈哈,直接来看吧!
示例很简单,就是给数组末位加一,在这里一共是三种情况:
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到一个小点都觉得很有意思!
还有更好的解法可以留言讨论哦!