LeetCode 66. 加一(C语言)| 数组反转 + 模拟进位

📅 发布时间:2026/7/12 9:01:50 👁️ 浏览次数:
LeetCode 66. 加一(C语言)| 数组反转 + 模拟进位
一、题目描述给定一个表示大整数的整数数组digits其中digits[i]是整数的第i位数字。这些数字按从左到右从最高位到最低位排列。请在该整数上加 1并返回结果数组。示例 1输入digits [1,2,3] 输出[1,2,4] 解释123 1 124示例 2输入digits [4,3,2,1] 输出[4,3,2,2] 解释4321 1 4322示例 3输入digits [9] 输出[1,0] 解释9 1 10提示1 digits.length 100 0 digits[i] 9 digits 不包含任何前导 0二、解题思路因为数组是高位 → 低位存储例如[1,2,3] → 123如果直接处理加法需要从后往前遍历。这里采用另一种思路先反转数组 → 从低位开始加 → 再反转回来这样逻辑更接近我们平时的加法计算。步骤一反转数组例如原数组 [1,2,3] 反转后 [3,2,1]此时最低位在前面。步骤二执行加一3 1 4得到[4,2,1]如果遇到99 1 10就会产生进位9 → 0 carry 1继续向高位传播。步骤三处理全是 9 的情况例如[9,9,9]反转后[9,9,9]加一过程91 → 0 91 → 0 91 → 0最后还有进位[0,0,0] 1需要扩展数组[0,0,0,1]步骤四再反转回来[0,0,0,1] ↓ [1,0,0,0]得到最终结果。三、C语言代码实现#include stdlib.h // 反转数组 void reverse(int* nums, int size) { int left 0; int right size - 1; while(left right) { int temp nums[left]; nums[left] nums[right]; nums[right] temp; left; right--; } } int* plusOne(int* digits, int digitsSize, int* returnSize) { // 1. 反转数组 reverse(digits, digitsSize); int carry 1; // 2. 从最低位开始加 for(int i 0; i digitsSize; i) { int sum digits[i] carry; digits[i] sum % 10; carry sum / 10; if(carry 0) break; } // 3. 如果还有进位 if(carry) { int* result (int*)malloc(sizeof(int) * (digitsSize 1)); for(int i 0; i digitsSize; i) result[i] digits[i]; result[digitsSize] 1; reverse(result, digitsSize 1); *returnSize digitsSize 1; return result; } // 4. 再反转回来 reverse(digits, digitsSize); *returnSize digitsSize; return digits; }四、复杂度分析时间复杂度O(n)反转数组 O(n)遍历数组 O(n)总体仍然是O(n)空间复杂度O(1)只有在全为 9时才需要新数组[9,9,9] → [1,0,0,0]五、总结这道题本质就是模拟十进制加法的进位过程。核心规律当前位 (当前位 进位) % 10 进位 (当前位 进位) / 10常见类似题目2. 两数相加链表进位415. 字符串相加989. 数组形式的整数加法这些题的本质都是从低位向高位处理进位问题。