LeetCode刷题记录---剑指Offer II

每次刷到 剑指Offer II 相关题将在此博文更新~~~

题目:

难度 题目
简单 剑指 Offer II 001. 整数除法
简单 剑指 Offer II 002. 二进制加法

⭐剑指 Offer II 001. 整数除法:

LeetCode刷题记录---剑指Offer II_第1张图片
LeetCode刷题记录---剑指Offer II_第2张图片
正数最大是231-1,因为32为符号位,即0x7fffffff。负数最小为-231,因为0x11111111补码为10000001。

class Solution:
    def divide(self, a: int, b: int) -> int:
        if b==1: return a
        if a==-2**31 and b==-1: # 除法结果溢出了
            return (2**31) - 1
        beichu, chu, res = abs(a), abs(b), 0
        # 从2**31 试到2**0再到1
        for i in range(31, -1, -1):
            # 2**i * b <= a
            while (chu<<i) <= beichu:
                res += (1<<i) # 即2**ii
                beichu -= (chu<<i)
        # 同号返回res, 异号返回-res即可
        return res if ((a>0) == (b>0)) else -res




⭐剑指 Offer II 002. 二进制加法:

LeetCode刷题记录---剑指Offer II_第3张图片
法1:模拟逢二进一即可。

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        # 法1:模拟逢二进一
        # 反转一下方便从低位遍历到高位
        a = a[::-1]
        b = b[::-1]

        res = [] # 存放结果
        len_a, len_b = len(a), len(b) 
        max_len = max(len_a, len_b)

        carry = 0
        for i in range(0, max_len):
            # 若该位没有数字了,那就0,方便和b进行相加
            carry += (int(a[i]) if i<len_a else 0) 
            carry += (int(b[i]) if i<len_b else 0)
            res.append(str(carry%2))
            carry //= 2
        if carry==1: res.append('1')
        return ''.join(res[::-1])

法2:位运算,计算每次的无进位相加结果,再和进位相加,直到无进位即可。

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        x = int(a, 2)
        y = int(b, 2)

        while y:
            # 无进位相加
            ans = x^y
            # 把每一位的进位算出来并移到其前一位
            carry = (x&y) << 1
            # 若有进位,则下一轮让无进位结果和进位相加
            x, y = ans, carry
        
        # 因为bin返回的是字符串类型的二进制数:如'0b0001',所以去掉0b即可
        return bin(x)[2:]
                

你可能感兴趣的:(算法与数据结构,leetcode,剑指offer)