这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
前言
今天是快乐的周六哦,一会就要开始令人紧张的世界总决赛了,恰好今天看到一道简单的算法题,它的题目叫做加一,那就预祝lpl冠军次数加一吧。哈哈哈
题目描述
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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就好了,而且题目中已经把这个数字分开放到数组里了,我连处理数字的过程都省了,可当我写完提交的时候不出意外的我错了,提交失败,我再一次想当然了。。。
- 这道题其实是分为三种情况,一种是每位上的数字都小于9的情况,这是我们直接把数组末尾的数加1就行了(这就是我自以为简单的那种情况,我第一眼就想到了这一种情况。。。)
- 第二中情况就是当数字中末尾存在若干个9的情况,那这时候我们就不能是简单的把末尾那个数加1了,我们还要考虑进位。。。
- 第二中情况中还有个特说情况,也就是我说的第三种情况,当数字中的所有数都是9的情况,那这时我们就要为数组多增加一项了,到此三种情况都处理完毕,下面上代码
var plusOne = function(digits) {
let index = digits.length-1
digits[index] = digits[index]+1
let curr = digits[index] //记录当前正在操作的值
while(curr>=10){
digits[index] = digits[index]-10
if(index-1>=0){
digits[index-1] = digits[index-1]+1
curr = digits[index-1]
index--
}else{ //这里就是第三种全为9时的情况需要做的特殊处理
digits.unshift(1)
return digits //这里一点要记得及时return
}
}
return digits
};
总结
做题如做事,当看到问题时的时候可能会感觉非常简单,这时候就要注意你是不是想当然了,一定要记得把所有的情况都考虑进去