力扣 66 == 加一算法详解与代码实现

44 阅读1分钟

力扣 66 == 加一算法详解与代码实现

目录

[TOC]

题目要求将一个用数组表示的非负整数加一,我们可以通过模拟数学中的加法运算来实现。关键在于正确处理进位,特别是当所有位都为9时的特殊情况。

关键步骤分析
  1. 从后向前遍历数组 :加一操作从最低位(数组末尾)开始,逐步处理进位。

  2. 处理非9的情况 :当前位不是9时,直接加一返回结果。

  3. 处理9的情况 :当前位是9时,将其置为0,并继续处理前一位。

  4. 处理全为9的情况 :若所有位都为9,最终在数组最前面添加1。

代码实现及解释
var plusOne = function (digits) {
  for (let i = digits.length - 1; i >= 0; i--) {
    if (digits[i] !== 9) {
      digits[i]++; // 当前位加一
      return digits; // 直接返回
    } else {
      digits[i] = 0; // 进位,当前位置0
    }
  }
  // 处理全为9的情况,如[9,9,9]变为[1,0,0,0]
  return [1, ...digits];
};
复杂度分析
  • 时间复杂度 :O(n),最多遍历数组一次。

  • 空间复杂度 :O(1)(原地修改)或 O(n)(全为9时新建数组)。

示例测试
  1. 输入[9,9,9]
  • 处理过程 :所有位变为0,最后添加1。

  • 输出[1,0,0,0]

  1. 输入[1,2,9]
  • 处理过程 :末位9变0,中间位2加一。

  • 输出[1,3,0]

  1. 输入[1,2,3]
  • 处理过程 :末位直接加一。

  • 输出[1,2,4]

总结

该方法避免了将数组转换为数字可能导致的溢出问题,直接逐位处理进位,高效且可靠。通过分情况讨论,确保所有可能的输入都能正确处理。