题目链接:
分析:题目属于普通的小模拟,也是考研算法最爱的手撕代码类,对于这类问题大家一定要掌握。
算法思路:模拟相加的过程,因为题目中给出的vector中的整数与我们平时的计算直觉相反,所以先进行一个reverse操作方便处理。
接下来定义一个temp常量,初始化为1,表示现存的进位那一位的值为1。然后模拟加法的过程即可,从最低位开始。判断该位的情况:
- 如果该位的值为9,且temp=1,说明需要向下一位进位。
- 如果该位的值不等于9,则根据temp的情况决定该位的值是否需要发生变化。
如此反复直到最后一位判断完毕。这里还有一个关键点,在所给的所有位数判断结束后,还需要检验temp是否为1。如果不为1,那么没有影响;如果为1,那么还需要开辟一个新位,存储该结果(类似于999+1=1000,这里只保存了三个0,我们需要把最高位的1也保存下来)。
一切结束后,再把结果reverse一下,就可以得到最终的答案。
下面是参考代码:
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
reverse(digits.begin(),digits.end());//反转字符串 方便处理
int temp=1; //设置
for(int i=0;i<digits.size();++i){
if(digits[i]==9&&temp==1){ //满足进位的情况
digits[i]=0;
}else if(temp!=9&&temp==1){ //不满足进位 但是该位的值需要自增
digits[i]++;
temp=0;
}
}
if(temp==1) //判断是否需要新创最高位
digits.push_back(1);
reverse(digits.begin(),digits.end());//反转回原来的答案
return digits;
}
};