开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
🍧 leetcode刷题之【加一】
1 题目
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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 <= digits.length <= 1000 <= digits[i] <= 9
2 个人解析
2.1 思路
看到这题第一感觉是这不就是给一个元素组,然后再输出一个元素组吗?再一看,诶,不是啊,原来是在数组的最后一位加一,那我就直接给这个组最后一个元素加一不就行了吗? 然后再一看还是不行,这里要考虑到一个进位的问题,所以呢我得在每一位上面判断是否需要定位,如果需要进位的话,那我就接着往前面加,一直加,一直加,一直加到不需要进位就算结束,然后再把这个前面的没有,计算过的数原样拷贝过来。 所以我就用了一个新数组来存放计算过的数,用一个flag变量来表示是否需要继续加下去了,当flag为0的时候就不需要继续计算这种加法,直接拷贝元素组的元素到新数组里面就可以了。ok,请看下面的代码
2.2 代码
- 实现方式1
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
let newDigites=[],flag = 1;
digits.reverse().map((value,index)=>{
console.log(value,flag)
if(flag===1&&value===9){
newDigites.unshift('0')
}
else if(flag===1){
newDigites.unshift(value+1+'');
flag=0;
}
else{
newDigites.unshift(value)
}
})
if(flag===1){
newDigites.unshift('1')
}
return newDigites;
};
- 实现方式2
第二种实现方式主要考虑到了一个内存容量的问题,使用这个方法可以使空间复杂度变低,这样占的内存就小了一些。
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
let newDigites=[],flag = 1;
for(let i=digits.length-1;i>=0;i--){
if(flag===1&&digits[i]===9){
newDigites.unshift('0')
}
else if(flag===1){
newDigites.unshift(digits[i]+1+'');
flag=0;
}
else{
newDigites.unshift(digits[i])
}
}
if(flag===1){
newDigites.unshift('1')
}
return newDigites;
};
3 小结
做这题的时候,我遇到到了一个精度的问题看一下我最原始写的代码,我发现一个问题,就是最后面几位数会是零,这个时候我才知道Js中有一个精度,整数只能显示到17位,后边的话就只能四舍五入,全为零了,所以对于计算大数的时候不能这样写
感谢看完:
- 博主个人前端网站:zhangqiang.hk.cn
- 欢迎加入博主的前端学习qq交流群::706947563,专注前端开发,共同学习进步啊 ~