1. 问题背景与需求分析
在编程面试和算法练习中,处理数字的数组表示是一个常见的基础问题。LeetCode第66题"加一"要求我们模拟大整数加1的操作,但输入和输出都以数组形式呈现。这种表示方法在实际开发中也很常见,比如处理超长数字时(超过语言内置类型的最大值),就需要用数组或字符串来存储。
这个问题的核心在于正确处理进位。看似简单,但有几个关键点需要考虑:
- 如何处理常规的加法(如123→124)
- 如何处理产生进位的加法(如129→130)
- 如何处理全9的特殊情况(如999→1000)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计思路解析
2.1 逆向遍历的必要性
从数组末尾开始遍历是解决这个问题的关键。这模拟了我们在纸上做加法时的计算顺序——从最低位(最右边)开始,向最高位(最左边)计算。这样设计有三大优势:
- 符合数学运算习惯:与我们手工计算加法的顺序一致,便于理解和验证
- 提前终止机会:只要某一位加1后不需要进位,就可以立即返回结果,避免不必要的计算
- 简化进位处理:只需要关注当前位和可能的进位,不需要考虑后续位的影响
2.2 进位处理的三种情况
在实际处理中,我们需要区分三种情况:
- 无需进位:当前位小于9,直接加1即可返回
- 示例:[1,2,3] → [1,2,4]
- 单次进位:当前位是9,但前一位不是9
- 示例:[1,2,9] → [1,3,0]
- 连续进位:多位都是9,需要连续进位直到首位
- 示例:[9,9] → [1,0,0]
3. 代码实现与逐行解析
以下是C语言的完整实现,我们将逐行分析其工作原理:
c复制int* plusOne(int* digits, int digitsSize, int* returnSize){
for(int i = digitsSize - 1; i >= 0; --i){
digits[i] = digits[i] + 1; // 当前位加1
if(digits[i] != 10){ // 如果不产生进位
*returnSize = digitsSize;
return d
