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

【leetcode】67.二进制求和

前言:剑指offer刷题系列

问题:

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

示例:

输入:a = "1010", b = "1011"
输出:"10101"

思路1:

我们为了避免去判断谁大谁小的边界问题,直接把最短的字符串前面先补0。设置一个保存进位的数,从低到高遍历,逢二进一。

先通过两个 while 循环将输入的二进制字符串 ab 的长度补齐,使它们的长度相等。如果其中一个字符串较短,就在它的前面添加0,以保证两个二进制数的位数相同。

然后,定义了一个变量 tmp 用来存储进位信息,初始化为0。同时,将字符串 ab 一起转换为列表,以便进行逐位相加操作。

接下来,通过一个 for 循环从字符串的最后一位开始逐位相加,从低位到高位。具体的相加规则如下:

  • 如果当前位的数字是0,1,2,3中的0,那么将进位 tmp 和当前位相加,并根据相加结果更新当前位。
  • 如果相加结果是3,表示当前位和进位都是1,那么当前位变为0,进位为1。
  • 如果相加结果是2,表示当前位和进位中有一个是1,那么当前位变为0,进位为1。
  • 如果相加结果是1,表示当前位和进位中只有一个是1,那么当前位变为1,进位为0。

最后,在循环结束后,检查是否还有进位 tmp。如果有进位,就在结果字符串的最前面添加一个 “1”。最终,返回结果字符串。

时间复杂度:O(n)

空间复杂度:O(n)

基于上述思考,代码如下:

class Solution:def addBinary(self, a: str, b: str) -> str:while len(a) > len(b):b = "0" + bwhile len(a) < len(b):a = "0" + atmp = 0a, b = list(a), list(b)for i in range(len(a) - 1, -1, -1):cur = int(a[i]) + int(b[i]) + tmpif cur == 3:b[i] = "1"tmp = 1elif cur == 2:b[i] = "0"tmp = 1elif cur == 1:b[i] = "1"tmp = 0else:b[i] = "0"tmp = 0if tmp == 1:b = ["1"] + breturn "".join(b)

执行结果如下图:

image-20230921213739847.png

思路2:

首先,将输入的二进制字符串 ab 使用 int(a, 2)int(b, 2) 转换为整数,基数为2,表示将二进制字符串转换为整数。然后,这两个整数相加,得到它们的和。

接下来,将上一步得到的和转换为二进制字符串形式,并通过切片操作去掉字符串的前缀"0b",以获取纯二进制数表示。

最终,该方法返回两个二进制数相加后的结果作为二进制字符串。

基于上述思考,代码如下:

class Solution(object):def addBinary(self, a, b):return bin(int(a,2)+int(b,2))[2:]

执行结果如下图:

image-20230921212905238.png

相关文章:

  • 2733: 【搜索】【广度优先】 马遍历棋盘
  • 一分钟了解JAVA语言
  • RuoYi-Vue开源项目2-前端登录验证码生成过程分析
  • C++提高笔记(五)---STL容器(set/multiset、map/multimap)
  • flutter 局部view更新,dialog更新进度,dialog更新
  • 【热门话题】深入浅出:npm常用命令详解与实践
  • Redis监控工具
  • mac安装rust开发环境,使用brew安装和全局配置
  • 【GPT-SOVITS-03】SOVITS 模块-生成模型解析
  • 【NTN 卫星通信】 TN和多NTN配合的应用场景
  • shardingsphere-elastic-job-ui 管理界面安装
  • 数据分析-Pandas数据分类的转换控制
  • 速盾cdn:cdn节点缓存内容不一致怎么办?
  • 面试经典-MySQL篇
  • MQTT和Modbus的物联网网关协议区别分析
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Android Volley源码解析
  • AngularJS指令开发(1)——参数详解
  • Apache的80端口被占用以及访问时报错403
  • React-Native - 收藏集 - 掘金
  • Shadow DOM 内部构造及如何构建独立组件
  • Travix是如何部署应用程序到Kubernetes上的
  • 安卓应用性能调试和优化经验分享
  • 官方解决所有 npm 全局安装权限问题
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 普通函数和构造函数的区别
  • 巧用 TypeScript (一)
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 昨天1024程序员节,我故意写了个死循环~
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (二)springcloud实战之config配置中心
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (一)基于IDEA的JAVA基础10
  • (转)树状数组
  • .net生成的类,跨工程调用显示注释
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [Android]创建TabBar
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [cocos2d-x]关于CC_CALLBACK
  • [CSS3备忘] transform animation 等
  • [Hive] CTE 通用表达式 WITH关键字
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx
  • [HNOI2006]鬼谷子的钱袋