最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • leetcode 66 加一 |刷题打卡

    正文概述 掘金(乘风破浪重名了)   2021-04-07   81

    一、题目描述:

    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]
    
    • 遍历数组对最后一位数字加一
    1. 如果最后一位小于9,加一后不存在进位,得到结果直接返回;
    2. 最后一位等于9都则加一后置为0,进一位;
    3. 如果数组中仅一个数字且存在进位,则数组首尾新增数字1;
    4. 如果数组中存在超过多个数字,则循环向前进位,直到最前面一位,同样判断是否需要进位,同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%的用户
    
    • 循环代码简化

    最后一位和倒数第二位的判断与循环判断逻辑一样,所以不用单独拿出来处理;

    1. 倒序循环判断当前数字加一后是否大于9,小于9则结束返回;
    2. 大于9则进位,即继续循环到下一位;
    3. 如果循环到数组第一位还没得到结果,则说明加一后第一位依然大于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%的用户
    
    • 循环代码优化
    1. 循环数组数字数组中每个元素只存储单个数字,加一后大于9则应为10,对10取余即可得到加一后的值;
    2. 如果对10取余不等于0则得到结果不用继续进位;
    3. 如果循环到数组第一位还没得到结果,则说明加一后第一位依然大于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%的用户
    

    三、总结:

    • JavaScriptNumber有最大的安全整数 (253 - 1)限制;
    • 数组中所有数字加一后判断处理逻辑一致,可简化代码;
    • 根据题意加一后要嘛小于10,不进位,结束;要嘛等于10,当前位置为1,进位1,可优化代码;

    起源地 » leetcode 66 加一 |刷题打卡

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元