【67】二进制求和

题目

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0

我的解题

int(" ",2):把" "的二进制表示转换成十进制int,再进行加减,然后转回二进制bin()返回 0b100,切片取0b后面的部分。

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

Accepted

  • 294/294 cases passed (36 ms)
  • Your runtime beats 54.56 % of python3 submissions
  • Your memory usage beats 72.62 % of python3 submissions (14.9 MB)

题解

法1:str.format()

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。

基本语法是通过 {} 和 : 来代替以前的 % 。

format 函数可以接受不限个参数,位置可以不按顺序。

此处"{0:b}"表示0位置处的二进制输出

class Solution:
    def addBinary(self, a, b) -> str:
        return '{0:b}'.format(int(a, 2) + int(b, 2))

Accepted

  • 294/294 cases passed (28 ms)
  • Your runtime beats 93.3 % of python3 submissions
  • Your memory usage beats 16.04 % of python3 submissions (15.1 MB)

法2:模拟二进制计算过程,逢二进一

法3:位运算

来自leetcode官方题解。

二进制的计算方式:位运算。

就算计算的数是整数,在计算过程中,也是按照二进制数进行运算的

在实际应用场景中,如果需要表示某种单一特性的状态,0和1就可以,用1bit表示一个对象,这大大节省了空间。运用这种数据结构的,就是位图,bitmap

如果不允许使用加减乘除,则可以使用位运算替代上述运算中的一些加减乘除的操作

如果不熟悉位运算,比如我,还是先去熟悉一下吧。

我们可以设计这样的算法来计算:(就是简单的相加)

  • 把 a 和 b 转换成整型数字 x 和 y,在接下来的过程中,x 保存结果,y 保存进位。
  • 当进位不为 0 时。计算当前 x 和 y 的无进位相加结果:answer = x ^ y (按位异或,如果不同则为1);计算当前 x 和 y 的进位:carry = (x & y) << 1 (x和y按位与,再左移1位,补0);完成本次循环,更新 x = answer,y = carry。
  • 返回x的二进制形式

异或是无进位加法。1^1=0,0^0=0,1^0=1,除了1+1=0是错误的,其它都对。

而我们需要1+1=10,可以想到与计算,1&1=1,那么还差一个0,可以左移1位补0,就是(1&1)<<1=10。所以进的位为0010。

我们再次重复上述过程,直到进位为0,则没进位前的结果就是我们的答案啦。

所以7+9=16的计算过程应该如下

  1. 7=0111;9=1001
  2. answer=7^9=1110=14
  3. carry=(7&9)<<1=(0001)<<1=0010=2
  4. answer=1110^0010=1100=12
  5. carry=(1110&0010)<<1=(0010)<<1=0100=4
  6. answer=1100^0100=1000=8
  7. carry=(1100&0100)<<1=(0100)<<1=1000=8
  8. answer=1000^1000=0000=0
  9. carry=(1000&1000)<<1=1000<<1=1 0000=16
  10. answer=00000^10000=10000=16
  11. carry=(00000&10000)<<1=00000=0

所以答案为16.

class Solution:
    def addBinary(self, a, b) -> str:
        x, y = int(a, 2), int(b, 2)
        while y:
            answer = x ^ y
            carry = (x & y) << 1
            x, y = answer, carry
        return bin(x)[2:]

Accepted

  • 294/294 cases passed (32 ms)
  • Your runtime beats 79.1 % of python3 submissions
  • Your memory usage beats 5.2 % of python3 submissions (15.2 MB)

为什么要用位运算?快啊!

学会了一个优化小技巧。

总结

python因为int无限大(优于java的一点),且具有高精度二进制计算,可以直接调用自带的函数,代码简洁。

如果要求速度优化,可以考虑位运算。贴近底层计算过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值