加一
622 字
3 分钟
加一
- 难度:简单
- 标签:数组、数学
题目描述
Note
原题说明:
给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右、从最高位到最低位排列。这个大整数不包含任何前导 0。
将该大整数 加一,并返回结果的数字数组。
示例
- 输入:
digits = [1,2,3]-> 输出:[1,2,4] - 输入:
digits = [9,9,9]-> 输出:[1,0,0,0]
方案一:逆序遍历与进位处理
核心思路: 数字加一的操作从最低位(数组末尾)开始。
- 如果某一位不为
9,加一后直接返回数组。 - 如果某位为
9,该位变为0,继续检查前一位。 - 若所有位都是
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; }};复杂度分析
- 时间复杂度:。其中 是数字的位数。最坏情况下(全是 9)需要遍历整个数组。
- 空间复杂度: 或 。
- 常规情况:原地修改,空间复杂度为 。
- 全 9 情况:需要创建一个长度为 的新数组,空间复杂度为 。
总结
- 进位意识:这道题本质上是模拟手动加法的个位进位过程。
- 原地修改优化:通过从后向前找到第一个非 9 数字,可以极大地减少不必要的数组重排。
- 边界处理:全
9序列是这道题唯一的“陷阱”,需要通过扩容数组或返回新数组来解决。
Tip
这种“数组模拟大整数运算”的思路,是以后处理更高级算法(如大数乘法、阶乘计算)的基础。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
最后更新于 2025-10-14,距今已过 197 天
部分内容可能已过时
相关文章 智能推荐
1
合并两个有序数组
算法 力扣第88题:合并两个有序数组。从正向合并的繁琐到逆向双指针的极简之美,实现 $O(m+n)$ 的高效原地合并。
2
x 的平方根
算法 力扣第69题:实现 sqrt(x)。深入理解二分查找在数值逼近中的应用,以及避免溢出的数学处理技巧。
3
爬楼梯
算法 力扣第70题:爬楼梯。从递归到动态规划(DP)的演进,深入理解斐波那契数列在算法中的美妙应用。
4
搜索插入位置
算法 力扣第35题:搜索插入位置。深入理解二分查找(Binary Search)的边界处理,实现 $O(\log n)$ 的极速搜索。
5
移除元素
算法 力扣第27题:原地移除数组中所有等于 val 的元素。深入理解快慢指针在乱序数组中的灵活应用。
随机文章 随机推荐