leetcode66. 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
题目分析
题意理解:给定一个数组,其中每个元素代表一个整数的一位,要求返回加一后的整数所对应的数组。
关键点:处理进位是关键,特别是当所有位都是9时,需要在数组前面添加一个1。
思维导图
算法步骤
从数组的末尾开始遍历。
对每一位数字加一。
如果加一后的结果为10,则将当前位设为0,并继续处理前一位。
如果所有位都处理完毕仍有进位,则在数组前添加一个1。
算法流程图
具体代码
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int n=digits.size();
int t=1;
if(digits.size()==1 && digits[0]==0)
{
digits[0]=1;
return digits;
}
while(n)
{
if(digits[n-1]+t==10)
{
t=1;
digits[n-1]=0;
}
else
{
if(t)
{
digits[n-1]+=1;
}
t=0;
}
n--;
}
if(t)
{
digits.insert(digits.begin(),1);
}
return digits;
}
};
算法分析
时间复杂度:O(n),其中n是数组的长度。最坏情况下需要遍历整个数组。
空间复杂度:O(1),除了输出数组外,只需要常数级别的额外空间。
易错点
忘记处理所有位都是9的特殊情况。
在处理进位时出错。
类似题
题目名称 | 题目描述 | 链接 |
---|---|---|
两数相加 | 给你两个非空的链表,表示两个非负的整数。它们每个节点都按照逆序的方式存储,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。 | 两数相加 |
字符串相加 | 给定两个字符串形式的非负整数 num1 和 num2 ,计算它们的和。 | 字符串相加 |
大数加法 | 给定两个非常大的整数,以字符串的形式表示,编写一个函数来计算它们的和。 | 大数加法 |