LeetCode-476. Number Complement

题目链接:476. Number Complement


题目描述:给你一个正整数,求这个正整数的二进数的值,全部取反后的整数的值。

  1. 这个正整数是一个小于32位的整数
  2. 你可以认为这个二进制数没有前导0,也就是说二进制数的第一位一定是1

这道题就没啥说的了,将给的正整数转化为二进制数,取反后再转化为整数,返回结果就ok。

我的代码(很渣):

class Solution(object):
    def findComplement(self, num):
        f = []
        for l in list(bin(num).replace("0b", "")):
            if l == '1':
                f.append('0')
            else:
                f.append('1')

        return int(''.join(f), 2)

这里再介绍一种很简洁的办法。
我大致讲解一下思路:

  1. 当i<=num时,i左移一位
  2. 用i-1的值与num异或去的结果

举例:
假设num=5(二进制:101)
当i=1(二进制:1)时,i<=num,此时i左移一位,i=2
当i=2(二进制:10)时,i<=num, i继续左移一位, i=4
当i=4(二进数:100)时,i<=num, i继续左移一位,i=8
当i=8(二进制数:1000)时,i>num, 此时i-1,即7(二进制:111)
此时7(111)与5(101)异或,结果为2(010)
所以最终的结果是2

class Solution(object):
    def findComplement(self, num):
        i = 1
        while i <= num:
            i = i << 1
        return (i - 1) ^ num

这道题的做法多种多样,但我觉得能过使用位运算来做出结果是一个非常好的方式。
推荐大家在做题的时候可以多想想怎么使用位运算来解决问题。

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值