Easy
题目描述
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
提示:
1 <= digits.length <= 1000 <= digits[i] <= 9digits不包含任何前导零
解题思路
解题思路
这道题模拟了手工加法的过程,核心是处理进位问题。
基本思路: 从数组的最后一位(个位)开始,给当前位加1。如果当前位小于9,直接加1后返回;如果等于9,则该位变为0,需要向前一位进位。
算法步骤:
- 从数组末尾开始遍历
- 如果当前位小于9,直接加1并返回结果
- 如果当前位等于9,将其设为0,继续处理前一位
- 如果所有位都是9(如[9,9,9]),最终会变成[1,0,0,0],需要在数组开头插入1
特殊情况处理:
- 当所有位都是9时,结果数组长度会增加1
- 一般情况下,只需要在某一位进行加1操作即可
这种从后往前的处理方式能够很好地模拟进位过程,时间复杂度为O(n),空间复杂度在最坏情况下为O(n)。
代码实现
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for (int i = digits.size() - 1; i >= 0; i--) {
if (digits[i] < 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
// 所有位都是9的情况
vector<int> result(digits.size() + 1, 0);
result[0] = 1;
return result;
}
};
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
for i in range(len(digits) - 1, -1, -1):
if digits[i] < 9:
digits[i] += 1
return digits
digits[i] = 0
# 所有位都是9的情况
return [1] + digits
public class Solution {
public int[] PlusOne(int[] digits) {
for (int i = digits.Length - 1; i >= 0; i--) {
if (digits[i] < 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
// 所有位都是9的情况
int[] result = new int[digits.Length + 1];
result[0] = 1;
return result;
}
}
var plusOne = function(digits) {
for (let i = digits.length - 1; i >= 0; i--) {
if (digits[i] < 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
// 所有位都是9的情况
return [1, ...digits];
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 最坏情况下需要遍历整个数组 |
| 空间复杂度 | O(1) | 除了返回结果外,只使用常数额外空间(最坏情况O(n)用于创建新数组) |
相关题目
. Multiply Strings (Medium)
. Add Binary (Easy)
. Plus One Linked List (Medium)