加一

622 字
3 分钟
加一

题目链接:66. 加一 - 力扣(LeetCode)

  • 难度:简单
  • 标签:数组、数学

题目描述#

Note

原题说明: 给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右、从最高位到最低位排列。这个大整数不包含任何前导 0

将该大整数 加一,并返回结果的数字数组。

示例#

  • 输入: digits = [1,2,3] -> 输出: [1,2,4]
  • 输入: digits = [9,9,9] -> 输出: [1,0,0,0]

方案一:逆序遍历与进位处理#

核心思路: 数字加一的操作从最低位(数组末尾)开始。

  1. 如果某一位不为 9,加一后直接返回数组。
  2. 如果某位为 9,该位变为 0,继续检查前一位。
  3. 若所有位都是 9(如 999),则最终需要在数组头部插入一个 1

源码实现#

class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int n = digits.size();
// 从后往前遍历
for (int i = n - 1; i >= 0; i--) {
if (digits[i] != 9) {
// 当前位不是 9,直接加 1 后返回
digits[i] += 1;
// 将后面的所有位设为 0(虽然在此逻辑中,后面的位本就已在之前的循环中变为了 0)
for (int j = i + 1; j < n; j++) {
digits[j] = 0;
}
return digits;
}
// 当前位是 9,变为 0,继续循环处理进位
digits[i] = 0;
}
// 如果程序运行到这里,说明所有位数都是 9(如 [9, 9, 9])
// 此时需要构造一个 [1, 0, 0, 0] 的数组
vector<int> result(n + 1, 0);
result[0] = 1;
return result;
}
};

复杂度分析#

  • 时间复杂度O(n)O(n)。其中 nn 是数字的位数。最坏情况下(全是 9)需要遍历整个数组。
  • 空间复杂度O(1)O(1)O(n)O(n)
    • 常规情况:原地修改,空间复杂度为 O(1)O(1)
    • 全 9 情况:需要创建一个长度为 n+1n+1 的新数组,空间复杂度为 O(n)O(n)

总结#

  • 进位意识:这道题本质上是模拟手动加法的个位进位过程。
  • 原地修改优化:通过从后向前找到第一个非 9 数字,可以极大地减少不必要的数组重排。
  • 边界处理:全 9 序列是这道题唯一的“陷阱”,需要通过扩容数组或返回新数组来解决。
Tip

这种“数组模拟大整数运算”的思路,是以后处理更高级算法(如大数乘法、阶乘计算)的基础。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

加一
https://firefly-7a0.pages.dev/posts/leetcode_notes/66plus-one/
作者
lonelystar
发布于
2025-10-14
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-10-14,距今已过 197 天

部分内容可能已过时

评论区

Profile Image of the Author
LonelyStar
Hello, I'm LonelyStar.
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
119
分类
11
标签
346
总字数
226,548
运行时长
0
最后活动
0 天前

目录