当前位置: 首页 > news >正文

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

相关文章:

  • HDU 4016 Magic Bitwise And Operation 暴搜+剪枝
  • 20165314 2016-2017-2 《Java程序设计》第3周学习总结
  • HDU 4090 GemAnd Prince 暴搜+剪枝
  • XML作用
  • ReportViewer:隐藏和GetDefaultPageSettings
  • ETL总结(扫盲版)
  • sql server 内置MD5加密函数
  • POJ 1011 Sticks 强大的剪枝
  • 2018/3/20 noip模拟赛 5分
  • windows2003 with OpenSSH
  • java和c#通过esb服务互调用组件
  • 4、自定义cookieHandler发送请求
  • python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
  • /*在DataTable中更新、删除数据*/
  • A* 简介(Amit's A star Page中译文)
  • [译] React v16.8: 含有Hooks的版本
  • 2017 年终总结 —— 在路上
  • export和import的用法总结
  • JavaScript对象详解
  • Java超时控制的实现
  • linux学习笔记
  • markdown编辑器简评
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Puppeteer:浏览器控制器
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Redis学习笔记 - pipline(流水线、管道)
  • socket.io+express实现聊天室的思考(三)
  • Solarized Scheme
  • 闭包,sync使用细节
  • 读懂package.json -- 依赖管理
  • 多线程 start 和 run 方法到底有什么区别?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 以太坊客户端Geth命令参数详解
  • 自定义函数
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (NSDate) 时间 (time )比较
  • (pojstep1.3.1)1017(构造法模拟)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (备忘)Java Map 遍历
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (三)Honghu Cloud云架构一定时调度平台
  • (算法)Travel Information Center
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .Net组件程序设计之线程、并发管理(一)
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [C\C++]读入优化【技巧】
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体