首先使用最直观 最ugly的代码AC,根据失败的case,AC的代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
int m = num1.size(),n = num2.size();
int carry = 0;
string res;
while(m > 0 && n > 0)
{
int num = num1[m-1]-'0'+num2[n-1]-'0'+carry;
carry = 0;
if(num >= 10)
{
carry = 1;
num = num%10;
}
res.insert(res.begin(),'0'+num);
m--;
n--;
}
while(n > 0)
{
int num = num2[n-1]-'0'+carry;
carry = 0;
if(num >= 10)
{
carry = 1;
num = num%10;
}
res.insert(res.begin(),'0'+num);
n--;
}
while(m > 0)
{
int num = num1[m-1]-'0'+carry;
carry = 0;
if(num >= 10)
{
carry = 1;
num = num%10;
}
res.insert(res.begin(),'0'+num);
m--;
}
if(carry)
res.insert(res.begin(),'1');
return res;
}
};
执行结果:
执行结果:通过 显示详情
执行用时:16 ms, 在所有 C++ 提交中击败了22.54%的用户
内存消耗:6.5 MB, 在所有 C++ 提交中击败了96.73%的用户
尝试优化代码,毕竟上面的代码看着比较乱,上面的代码使用了三个循环,可以优化为一个循环:
class Solution {
public:
string addStrings(string num1, string num2) {
int m = num1.size() - 1, n = num2.size() -1;
int carry = 0;
string res;
while(m >= 0 || n >= 0 || carry)
{
int sum = carry;
if(m >= 0) sum += num1[m--]-'0';
if(n >= 0) sum += num2[n--]-'0';
carry = sum/10;
sum = sum %10;
res += sum +'0';
}
reverse(res.begin(),res.end());
return res;
}
};
上面值得注意的是我们先正序拼接,再进行逆序,执行时间会大幅度缩短。