阅读 637

leetcode 66 加一 |刷题打卡

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

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]
复制代码

未通过,异常原因:超过JS数值最大限制;

  • 遍历数组对最后一位数字加一
  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,可优化代码;
文章分类
前端
文章标签