class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int head = 0;//判断是否连续出现9的标志位
//不出现9的情况
digits[digits.size()-1]++;
if(digits[digits.size()-1]!=10)
{
return digits;
}
//出现9的情况
unordered_map <int, int> m;//开哈希表
for (int num=0 ;num<digits.size();num++) {//利用m[num]判断这个位置是否出现了9或是10
if(digits[num]==9||digits[num]==10)
{++m[num];}
}
for(int num=digits.size()-1 ;num>=0;num--)
{
if(m.count(num)==1&&head==0)//连续出现的9换成0
{ digits[num]=0;
}
else if(head==0)//出现了不是9的情况,标志位置1,当前位加一
{
digits[num]++;
head=1;
}
}
if(digits[0]==0)//如果首位为9,经过刚才的逻辑应该为0,这时需要在vector容器的前方插入1
{
digits.insert(digits.begin(),1);
}
return digits;
}
};
官方题解力扣
方法一:找出最长的后缀 99
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) {
++digits[i];
for (int j = i + 1; j < n; ++j) {
digits[j] = 0;
}
return digits;
}
}
// digits 中所有的元素均为 9
vector<int> ans(n + 1);
ans[0] = 1;
return ans;
}
};
思路差不多,就是分类的方法不同,分成末尾没有 9,末尾有若干个 9,所有元素都是 9。
最后处理全是9的情况也是更加优雅,直接生成一个长度加一首位为1的新数组。