来自北大算法课的Leetcode题解:476. 数字的补数

本文探讨了两种求解整数二进制补数的方法:标准除2取余法和使用Python内置函数。首先介绍了基础的除2右移操作,随后展示了如何通过map和join函数简化二进制转换过程。两种方法对比,适合不同场景的优化实践。
摘要由CSDN通过智能技术生成

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(T38% S13%): 标准的除2取余法想把原数变为二进制,并用数组保存每一位,再依次构建补数的十进制

    • 改进1(T96% S81%): 取消数组,依次循环边拆边建
    • 改进2: 可进一步把//= 2变为右移>> 1*= 2变为左移<< 1

    注意移位运算移动一位就相当于乘除2了!

  • 解法2(T75% S22%): 通过python库函数

    • bin():十进制 → 二进制
    • int("0bxxx", r):r进制 → 十进制
    int("".join(map(lambda x: str(int(not int(x))), bin(num)[2:])), 2)
    
    • bin(num)[2:]计算二进制(字符串,且以0b开头因此要去掉)
    • map()将每个字符变为数字然后去非,再转换为数字,并最后转换为字符(否则没法拼接)
    • “”.join()对二进制数组拼接
    • int(””, 2)将二进制转为十进制
class Solution(object):
    def findComplement(self, num):
        """
        :type num: int
        :rtype: int
        """
        # 解法1 改进
        res = 0
        rank = 1
        while num>1:
            bi = num % 2
            num >>=  1
            res += rank if bi==0 else 0
            rank <<= 1
        
        return res

    def otherSolution(self, num):
        # 解法2
        # `bin(num)[2:]`计算二进制(字符串,且以0b开头因此要去掉)
        # `map()`将每个字符变为数字然后去非,再转换为数字,并最后转换为字符(否则没法拼接)
        # `“”.join()`对二进制数组拼接
        # `int(””, 2)`将二进制转为十进制
        return int("".join(map(lambda x: str(int(not int(x))), bin(num)[2:])), 2)


        # 解法1
        bi_arr = []
        while num>1:
            bi_arr.append(num % 2)
            num //= 2
        
        res = 0
        for i, bi in enumerate(bi_arr):
            res += 2**i if bi==0 else 0
        return 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值