赞
踩
加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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; } };
拜拜
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。