剑指 Offer II 002. 二进制加法

题目描述

二进制加法:给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。

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

提示:

  • 每个字符串仅由字符 '0' 或 '1' 组成。
  • 1 <= a.length, b.length <= 10^4
  • 字符串如果不是 "0" ,就都不含前导零。

代码&思路

直接运算

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

算法复杂度:O(a.length + b.length)

位运算

二进制加法可以拆分为按位相加(相同为0,不同为1),逐个进位(当前位有进位,前一位加1)的运算。所以可以分解为多次循环求解。

每次循环:
ans^CF(异或运算)取得无进位数ans;
ans&CF(与运算)取得进位CF,左移得到进位;
直到进位CF等于0,也就是无进位,运算结束。

class Solution:
def addBinary(a, b):
    CF = 1
    x, y = int(a, 2), int(b, 2)
    while CF::
        ans = x ^ y
        CF = (x & y) << 1
        x, y = ans, CF
    return bin(ans)[2:]

算法复杂度:O(max {x.length, y.length} )

Python总结

str.format() 格式化数字

int(a, n) 字符串转数字

bin(x)[2:] x的二进制表示

posted @ 2022-12-14 17:20  tree123  阅读(74)  评论(0)    收藏  举报