问题描述:
Given two non-negative integers num1
and num2
represented as string, return the sum of num1
and num2
.
Note:
- The length of both
num1
andnum2
is < 5100. - Both
num1
andnum2
contains only digits0-9
. - Both
num1
andnum2
does not contain any leading zero. - You must not use any built-in BigInteger library or convert the inputs to integer directly.
问题比较简单,string类型的加法,把num1和num2由后往前遍历,每个元素依次相加,用f记录是否进位,第一次提交超时,后来把进位判断 改为f = sum/10 ; sum %= 10;就通过了,课件if判断语句效率比较低
算法:
class Solution {
public:
string addStrings(string num1, string num2) {
int s1len = num1.length()-1;
int s2len = num2.length()-1;
string res = "";
int f =0;
while (s1len>=0 || s2len>=0 || f ) {
int sum = 0;
if (s1len >= 0)
sum += (num1[s1len--] - '0');
if (s2len >= 0)
sum += (num2[s2len--] - '0');
sum += f;
f = sum/10;
sum %= 10;
res = res + to_string(sum);
}
reverse(res.begin(), res.end());
return res;
}
};
在solution看到一个c++ 3ms 5lines的算法,其实核心思路是一样的,只是用了很多c++编程的tricks,一并贴上并附注释:
class Solution {
public:
string addStrings(string num1, string num2) {
//第一行调用自己,巧妙的确保了num1的长度大于num2
if (num1.size() < num2.size()) return addStrings(num2, num1);
int carry = 0, i = num1.size() - 1, j = num2.size() - 1;
//按num1的长度遍历,这里把carry的计算放在的for循环里,计算量并没有减少,但是可以少一行代码
for (; i >= 0 && (carry || j >= 0); i--, j--, carry /= 10)
//这一行有2个tricks
//1、+= 赋值运算不仅会计算carry的值,同时也会把计算结果返回
//2、+'0'把int转成了char
num1[i] = (carry += num1[i] - '0' + (j >= 0 ? num2[j] - '0' : 0)) % 10 + '0';
//最后一行判断是否有进位,有进位在返回值前+'1'
return (carry ? "1" : "") + num1;
}
};