加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
思路一:
把数组中的内容,按位输出变成十进制数,加一后再按位压入数组。
错误:没有考虑当发生进位时,前后两数的size不一样。
应该加一个判断是否数组每一位都是九9的判别条件 如果是的话 size就加1
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
vector<int>::iterator it;
int sum=0;
for(int i=digits.size()-1,j=0;i>=0;--i,++j){
sum+=digits[j]*pow(10,i);
}
sum+=1;
vector<int>vec;
for(int k=digits.size()-1;k>=0;--k){
int m=pow(10,k);
int n=sum/m;
vec.push_back(n);
sum=sum-n*m;
}
return vec;
}
};
我的想法为什么总是很傻逼,菜鸡一个。
介绍下别人的思路,优秀
从后向前遍历,找到第一个不为9的数 该位置加1,改该位置后面的所有元素为0 如果没有找到不为9的元素,则情况为9,99
999这一类,此时在数组中插入size个0,在begin位置插入1.
```cpp
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int len=digits.size();
for(int i=len-1;i>=0;i--) //从后向前
{
//找到第一位不为9的,该位+1,该位后面的均变为0
if(digits[i]!=9)
{
digits[i]+=1;
for(int j=i+1;j<len;j++)
digits[j]=0;
return digits;
}else //digits[i]==9 继续往前找不等于9的
continue;
}
//上面没找到不等于9的,说明是99999...,返回100000...
vector<int> ans(len, 0);
ans.insert(ans.begin(),1);
return ans;
}
};
作者:flora-5
链接:https://leetcode-cn.com/problems/plus-one/solution/c-cong-hou-xiang-qian-yi-ci-bian-li-by-flora-5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
另一个优秀的思路:
算法思路:
对于上述情况1,直接在最后一位加11即可。
对于上述情况2,只需从后向前遍历数组,逢99进11,直至非99结束。
对于上述情况3,我们在最开始不需要与情况2区分,只需要在按照情况2遍历结束后判断首位,若首位为00,则代表情况3出现,此时直接在vector末尾添加1个00,再将首位由00变为11即可。
作者:donggua-2
链接:https://leetcode-cn.com/problems/plus-one/solution/cbian-li-yi-ci-kong-jian-o1zhi-yao-0ms-by-donggua-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for (int i = (int)digits.size() - 1; i >= 0; i--) {
if (digits[i] == 9) {
digits[i] = 0;
}
else {
digits[i]++;
break;
}
}
if (digits[0] == 0) {
digits.push_back(0);
digits[0] = 1;
}
return digits;
}
};
作者:donggua-2
链接:https://leetcode-cn.com/problems/plus-one/solution/cbian-li-yi-ci-kong-jian-o1zhi-yao-0ms-by-donggua-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
最后我消化后的写法,虽然冗长但是真的理解了,感谢各位大佬的题解答案。
```cpp
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for(auto it=digits.end()-1;it>=digits.begin();--it){
if(*it!=9){
*it+=1;
return digits;
}
else
{
*it=0;
for(auto it1=it+1;it1<digits.end();it1++){
*it1=0;
}
}
}
while(digits[0]==0)
{
digits.push_back(0);
digits[0]=1;
}
return digits;
}
};
拜拜