返回

JavaScript LeetCode 66:加一,代码实战与技巧解密

前端

前言

在计算机编程中,处理数字加法是常见且重要的任务。LeetCode 66. 加一 题正是此类问题的经典范例,它要求我们对给定的整数数组表示的非负整数进行加一操作。

算法原理

对于非负整数数组 nums,加一操作的算法原理很简单:从数组的最低有效位开始,依次对每一位数字进行加一操作。如果加一后数字溢出(即超过 9),则将该位重置为 0 并将进位标志设置为 1,继续对下一位数字进行加一。

代码实现

/**
 * LeetCode 66. 加一
 * @param {number[]} nums 非负整数数组
 * @return {number[]} 加一后的数组
 */
const plusOne = (nums) => {
  // 从最低位开始遍历数组
  for (let i = nums.length - 1; i >= 0; i--) {
    // 将当前位加一
    nums[i] += 1;

    // 如果进位为 0,则停止遍历
    if (nums[i] < 10) {
      return nums;
    }

    // 进位为 1,则将当前位重置为 0
    nums[i] = 0;
  }

  // 如果所有位都进位,则在数组开头添加 1
  nums.unshift(1);
  return nums;
};

优化技巧

为了优化代码性能,可以采用以下技巧:

  • 利用数组的 reverse 方法: 由于从最低位开始遍历数组,可以使用 reverse 方法将数组反转,这样可以简化代码结构。
  • 使用模运算: 对于加一操作,可以利用模运算 % 技巧进行优化。例如,(nums[i] + 1) % 10 可以获得加一后的数字的个位数。
  • 提前退出循环: 如果在遍历过程中发现某位数字加一后不进位,则可以提前退出循环。

完整代码(优化版)

/**
 * LeetCode 66. 加一
 * @param {number[]} nums 非负整数数组
 * @return {number[]} 加一后的数组
 */
const plusOne = (nums) => {
  // 反转数组
  nums.reverse();

  // 从最低位开始遍历数组
  for (let i = 0; i < nums.length; i++) {
    // 加一并取个位数
    nums[i] = (nums[i] + 1) % 10;

    // 如果不进位,则停止遍历
    if (nums[i] !== 0) {
      return nums.reverse();
    }
  }

  // 如果所有位都进位,则在数组开头添加 1
  nums.unshift(1);
  return nums;
};

示例

console.log(plusOne([1, 2, 3])); // [1, 2, 4]
console.log(plusOne([9, 9, 9])); // [1, 0, 0, 0]
console.log(plusOne([0])); // [1]

总结

通过对 LeetCode 66. 加一 题的深入分析,我们不仅掌握了算法原理和代码实现技巧,还了解了如何通过优化技术提升代码性能。掌握这些知识,可以为我们解决更多复杂的数据操作问题奠定坚实的基础。