您的位置:首页 > 其它

leetcode数组之Plus One

2017-04-15 22:49 267 查看
/*【题目】
Given a number represented as an array of digits, plus one to the number.
【题意】
给你一个用数组表示的数,求加一之后的结果,结果还是用数组表示。
【分析】
思路是维护一个进位,对每一位进行加一,然后判断进位,如果有继续到下一位,否则就可以返回了,因为前面不需要计算了。
注意:如果到了最高位进位仍然存在,那么必须重新开辟一个空间,然后把第一个为赋值为1(因为只是加一操作,其余位一定是0,否则不会进最高位)。只需要一次扫描,所以算法复杂度是O(n),n是数组的长度。而空间上,一般情况是O(1),但是如果数是全9,那么是最坏情况,需要O(n)的额外空间,使用vector时,直接insert即可;

时间复杂度 O(n),空间复杂度 O(1) 
*/

//本题中是PulsOne,更一般的情况是puls(k),本代码为一般情况
class Solution {
public:
vector<int> plusOne(vector<int> &digits)
{
add(digits,1);
return digits;
}
private:
void add(vector<int> &digits,int k)
{
int carryBit=k;
for(auto it=digits.rbegin();it!=digits.rend();++it)
{
*it+=carryBit;
carryBit=*it/10;
*it%=10;
}
if(carryBit>0)
digits.insert(digits.begin(),1);
}
};

//k=1
class Solution
{
public:
vector<int> plusOne(vector<int> &digits)
{
// 从后往前,碰到第一个不是9的就对其加1,然后返回即可
for(int i = digits.size() - 1; i >= 0; -- i)
{
if(digits[i] == 9)
digits[i] = 0;
else
{
++ digits[i];
return digits;
}
}
// 最高位改成1,最后再添加个0
digits[0] = 1;
digits.push_back(0);
return digits;
}
};

//更一般的情况, 两个大数分别用两个数组表示,这两个数组相加;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: