我的js算法爬坑之旅-加一

116 阅读1分钟

第十四天:力扣第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,进一位,后面90
            {
                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));
};