LeetCode-476. Number Complement

来源:互联网 发布:算法问题实战策略pdf 编辑:程序博客网 时间:2024/06/05 22:39

题目链接: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

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

以上。