目录
题目要求将一个用数组表示的非负整数加一,我们可以通过模拟数学中的加法运算来实现。关键在于正确处理进位,特别是当所有位都为9时的特殊情况。
关键步骤分析
-
从后向前遍历数组:加一操作从最低位(数组末尾)开始,逐步处理进位。
-
处理非9的情况:当前位不是9时,直接加一返回结果。
-
处理9的情况:当前位是9时,将其置为0,并继续处理前一位。
-
处理全为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时新建数组)。
示例测试
-
输入:
[9,9,9]
-
处理过程:所有位变为0,最后添加1。
-
输出:
[1,0,0,0]
-
-
输入:
[1,2,9]
-
处理过程:末位9变0,中间位2加一。
-
输出:
[1,3,0]
-
-
输入:
[1,2,3]
-
处理过程:末位直接加一。
-
输出:
[1,2,4]
-
总结
该方法避免了将数组转换为数字可能导致的溢出问题,直接逐位处理进位,高效且可靠。通过分情况讨论,确保所有可能的输入都能正确处理。