• 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和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


  • 相关阅读:
    转载《XAMPP安装和使用教程》(转)
    EA经典教程(转)
    something to note
    XAMPP安装说明及操作指南 (转)
    Use vCard Objects in RDF/XML (转)
    word2007的相关操作如删除标记区等 及firefox 修改颜色
    jsp和servlet重定向
    HowToMakeCustomSearch
    关于树型dropdownlist的绑定
    在ASP.NET中显示进度条
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8597792.html
Copyright © 2020-2023  润新知