1. 问题背景与理解
"加一"是LeetCode题库中编号第66题的经典算法问题,属于数组操作类的基础题型。我第一次遇到这个问题是在准备校招面试时,它看似简单却暗藏多个考察点。题目要求给定一个由非负整数组成的非空数组,其中每个元素代表数字的一位(最高位在数组最左侧),将这个数字加一后返回新的数组。
举个例子:
- 输入 [1,2,3] 表示数字123,加一后应返回 [1,2,4]
- 输入 [9,9] 表示99,加一后返回 [1,0,0]
这个问题的核心在于处理数字进位的情况。当最低位是9时,加一会产生进位,可能引发连锁反应直到数组首位。我在实际面试中遇到过3次这个题目,发现面试官常通过它考察候选人对边界条件的处理能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法思路分析
2.1 暴力解法与问题
最直观的想法是将数组转为数字,加一后再转回数组:
python复制def plusOne(digits):
num = int(''.join(map(str, digits))) + 1
return list(map(int, list(str(num))))
这种方法虽然简单,但存在两个致命缺陷:
- 当数组长度超过32位整数范围时会溢出
- 转换过程消耗额外的时间和空间
我在第一次实现时就踩了这个坑,当测试用例是20位以上的数字时就报错了。这提醒我们:算法题中要特别注意数据范围限制。
2.2 正确的模拟进位法
更合理的解法是模拟手工加法运算的过程:
- 从数组末尾开始向前遍历
- 当前位加一后取模10
- 如果余数不为0则停止,否则继续进位
- 如果首位也需要进位,则在数组前插入1
python复制def plusOne(digits):
for i in range(len(digits)-1, -1, -1):
digits[i] = (digits[i] + 1) % 10
if digits[i] != 0:
return digits
return [1] + digits
这个算法的时间复杂度是O(n),最坏情况下需要遍历整个数组;空间复杂度是O(1),除了极端情况(全为9)外不需要额外空间。
