题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字
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的计算过程应该如下:
- 7=0111;9=1001
- answer=7^9=1110=14
- carry=(7&9)<<1=(0001)<<1=0010=2
- answer=1110^0010=1100=12
- carry=(1110&0010)<<1=(0010)<<1=0100=4
- answer=1100^0100=1000=8
- carry=(1100&0100)<<1=(0100)<<1=1000=8
- answer=1000^1000=0000=0
- carry=(1000&1000)<<1=1000<<1=1 0000=16
- answer=00000^10000=10000=16
- 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的一点),且具有高精度二进制计算,可以直接调用自带的函数,代码简洁。
如果要求速度优化,可以考虑位运算。贴近底层计算过程。