LeetCode 67. Add Binary

问题链接

LeetCode 67. Add Binary

题目解析

将两个二进制字符串相加。

解题思路

注意两个问题,一是进位问题,二是长度问题。这里采用一种巧妙的方法,使用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和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


原文地址:https://www.cnblogs.com/AlvinZH/p/8597792.html