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


  • 相关阅读:
    线程安全和非线程安全
    spring MVC和hibernate的结合
    Spring学习笔记1——基础知识 (转)
    bitset && Luogu 3674 小清新人渣的本愿
    luogu P3452 [POI2007]BIU-Offices
    每日刷题记录
    Codeforces Round #721 (Div. 2) B2. Palindrome Game (hard version)
    2019湘潭邀请赛A
    2021CCPC浙江省赛 B
    Codeforces Round #720 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8597792.html
Copyright © 2011-2022 走看看