一、题目描述:
leetcode 66 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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 <= 100
0 <= digits[i] <= 9
二、思路分析:
- 将数组转换为
Number
类型后进行加一计算,计算后再转换成数组
AC 代码
var plusOne = function(digits) {
let num = Number(digits.join('')) + 1;
return String(num).split('');
};
执行结果
输入: [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3]
输出: [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0]
预期结果: [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,4]
- 遍历数组对最后一位数字加一
- 如果最后一位小于9,加一后不存在进位,得到结果直接返回;
- 最后一位等于9都则加一后置为0,进一位;
- 如果数组中仅一个数字且存在进位,则数组首尾新增数字1;
- 如果数组中存在超过多个数字,则循环向前进位,直到最前面一位,同样判断是否需要进位,同3处理;
AC代码
var plusOne = function(digits) {
let len = digits.length;
let last = digits[len - 1];
if(last < 9) {
digits[len - 1] = last + 1;
return digits;
} else {
digits[len - 1] = 0;
if(digits[len - 2]) {
digits[len - 2] = digits[len - 2] + 1;
} else {
digits.unshift(1);
}
for(let i = len - 2; i >= 0; i --) {
let last = digits[i];
if(last <= 9) {
return digits;
} else {
digits[i] = 0;
if(digits[i - 1]) {
digits[i - 1] = digits[i - 1] + 1;
} else {
digits.unshift(1);
}
}
}
return digits;
}
};
执行结果
执行结果:通过
执行用时:88 ms, 在所有 JavaScript 提交中击败了45.36%的用户
内存消耗:37.7 MB, 在所有 JavaScript 提交中击败了88.91%的用户
- 循环代码简化
最后一位和倒数第二位的判断与循环判断逻辑一样,所以不用单独拿出来处理;
- 倒序循环判断当前数字加一后是否大于9,小于9则结束返回;
- 大于9则进位,即继续循环到下一位;
- 如果循环到数组第一位还没得到结果,则说明加一后第一位依然大于9,则数组最开始增加一个进位1;
AC代码
var plusOne = function(digits) {
let len = digits.length;
for(let i = len - 1; i >= 0; i --) {
let last = digits[i] + 1;
if(last <= 9) {
digits[i] = last;
return digits;
} else {
digits[i] = 0;
}
}
digits.unshift(1);
return digits;
};
执行结果
执行结果:通过
执行用时:92 ms, 在所有 JavaScript 提交中击败了 27.81%的用户
内存消耗:37.9 MB, 在所有 JavaScript 提交中击败了51.86%的用户
- 循环代码优化
- 循环数组数字
数组中每个元素只存储单个数字
,加一后大于9则应为10,对10取余即可得到加一后的值; - 如果对10取余不等于0则得到结果不用继续进位;
- 如果循环到数组第一位还没得到结果,则说明加一后第一位依然大于9,则数组最开始增加一个进位1;
AC代码
var plusOne = function(digits) {
let len = digits.length;
for(let i = len - 1; i >= 0; i --) {
digits[i] ++;
if(digits[i] % 10) {
return digits;
} else {
digits[i] = 0;
}
}
digits.unshift(1);
return digits;
};
执行结果
执行结果:通过
执行用时:88 ms, 在所有 JavaScript 提交中击败了45.36%的用户
内存消耗:37.9 MB, 在所有 JavaScript 提交中击败了41.96%的用户
三、总结:
JavaScript
中Number
有最大的安全整数 (253 - 1)限制;- 数组中所有数字加一后判断处理逻辑一致,可简化代码;
- 根据题意加一后要嘛小于10,不进位,结束;要嘛等于10,当前位置为1,进位1,可优化代码;
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!