第十四天:力扣第66题,加一
地址:leetcode-cn.com/problems/pl…
思路:一开始是转字符串,再转数字,加一后转数组:
return (parseInt(digits.join(""))+1).toString().split("");
结果后面数字位数多了就报错了。想了一会,只有老老实实的在数组上进行运算了。
var plusOne = function(digits) {
let a = digits.length-1;
function sum(a)
{
if (digits[a]==9&&a!=0)//这个是最后一项为9的话,向前循环。
{
return arguments.callee(a-1);//可以用return sum(a-1) }
else if(a==0&&digits[a]==9)//从第一项到最后一项都是9,进一位,后面9变0
{
for(let i = 0;i<digits.length;i++)
{
digits[i]=0;
}
digits.unshift("1");//进一位。
}
else{
if(digits[a+1]==9)//不完全为9,前面进以为,后面9变0
{
for(let i = a+1;i<digits.length;i++)
{
digits[i]=0;
}
}
digits[a]=digits[a]+1;
}
}
sum(a);
return digits;
};
执行用时:76 ms, 在所有 JavaScript 提交中击败了92.82% 的用户
内存消耗:37.8 MB, 在所有 JavaScript 提交中击败了7.44% 的用户
这个方法有点傻,比较耗内存。
找到了一个比较好的代码,用的是ES10基本类型BigInt,我之前转数字会超过范围,而在ES10中,规范新引入了一种基本数据类型BigInt。它可以完美地兼容大数。
var plusOne = function(digits) {
// 数值6145390195186705544超出Number基本类型的容纳范围,改用BigInt基本类型
let num = BigInt(digits.join(''));
// BigInt基本类型进行数学操作时,需要在数字字面量后加个n
let string = String(num + 1n);
let ary = string.split('');
return ary.map(str => Number(str));
};