问题链接
题目解析
将两个二进制字符串相加。
解题思路
注意两个问题,一是进位问题,二是长度问题。这里采用一种巧妙的方法,使用add变量记录进位情况,每次从两个字符串中取出数字进行计算,若不存在数字则视为0,这样就不用考虑长度问题了。
注意最后还需再判断一次进位情况,决定是否需要在结果前加上一个1。
参考代码
class Solution {
public:
string addBinary(string a, string b) {
int n = a.length()-1, m = b.length()-1;
string res = "";
int sum = 0, add = 0;
while(n >= 0 || m >= 0) {
int x = n >= 0 ? a[n--]-'0' : 0;
int y = m >= 0 ? b[m--]-'0' : 0;
sum = x + y + add;
res = to_string(sum%2) + res;
add = sum / 2;
}
return add == 1 ? "1" + res : res;
}
};
探讨时间复杂度
如果问你上述代码时间复杂度是多少,你可能会直接说 (O(n)),我也会这样说。然而这是错的,答案是 (O(n^2)),为什么呢?在于这一句:res = to_string(sum%2) + res;
我是在LeetCode的讨论发现这个问题的,其中说道在字符串前加字符的复杂度是 (O(s.length))。正确做法应该是在字符串后追加字符,最后再反转字符串。参考代码如下:
这真的对吗?为什么提交上去时间并没有多大变化了,sad。
class Solution {
public:
string addBinary(string a, string b) {
string res = "";
int sum = 0,n = a.length()-1, m = b.length()-1;
while(n >= 0 || m >= 0 || sum == 1) {
sum += n >= 0 ? a[n--]-'0' : 0;
sum += m >= 0 ? b[m--]-'0' : 0;
res = res + to_string(sum%2);
sum = sum / 2;
}
reverse(res.begin(), res.end());
return res;
}
};
LeetCode All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.