思想:让digits最后一位+1,如果进位了就往前一位进1.
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
vector<int> v;
int i=0;
if(digits[i]==0){digits[i]=1;return digits;}
int n=digits.size()-1;
for(int i=0;i<n;i++)
{
v.push_back(digits[i]);
}
digits[n]+=1;
if(digits[n]<10)
v.push_back(digits[n]);
if(digits[n]>=10)
{
int mod=digits[n]%10;
int chu=digits[n]/10;
v.push_back(chu);
v.push_back(mod);
}
return v;
}
};
刚开始写的这个没有考虑到全部进位,只考虑了最后一位进位,就有了如下错误:
所以我们要考虑全局进位的问题:
直接套用acwing 高精度大叔数相加模版:acwing 大数相加 - 掘金 (juejin.cn)
class Solution {
public:
const int N = 1e6+10;
vector<int> c;
void sum(vector<int>& a)//引用是为了提高效率,尽可能不调用拷贝构造
{
int t=1;
for(int i=0;i<a.size();i++)
{
if(i<a.size()) t+=a[i];
c.push_back(t%10);
t/=10;
}
if(t)
c.push_back(1);
reverse(c.begin(),c.end());
}
vector<int> plusOne(vector<int>& digits) {
vector<int> v1;
for(int i=digits.size()-1;i>=0;i--) //54321
{
v1.push_back(digits[i]);
}
sum(v1);
return c;
}
};
第二种思想就是转化为字符串,字符串再转为数字+1
class Solution {
public:
vector<int> c;
void JUDE(vector<int>& d)
{
long long a=0;
string t="";
for(int i=0;i<d.size();i++)
{
t+=to_string(d[i]);
}
if(!t.empty())
{
a=stoll(t);
}
a+=1;
while(a)
{
c.push_back(a%10);
a/=10;
}
reverse(c.begin(), c.end());
}
vector<int> plusOne(vector<int>& digits) {
if(digits.empty())return c;
JUDE(digits);
return c;
}
};
例如下面 这个数字: