leetcode_476 数字的补数

106 阅读2分钟

要求

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

  • 例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。 给你一个整数 num ,输出它的补数。

示例 1:

输入:num = 5
输出:2
解释:5 的二进制表示为 101(没有前导零位),其补数为 010。所以你需要输出 2 。

示例 2:

输入:num = 1
输出:0
解释:1 的二进制表示为 1(没有前导零位),其补数为 0。所以你需要输出 0 。

核心代码

class Solution:
    def findComplement(self, num: int) -> int:
        binary = list()
        while num >= 2:
            temp = num % 2 
            binary.append(temp)
            num = (num- temp) // 2
        binary.append(num) 
        res = 0
        multiplex  = 1
        for item in binary:
            res += (1-item) * multiplex
            multiplex *= 2
        return res

另一种解法

class Solution:
    def findComplement(self, num: int) -> int:
        res = 0
        pos = 0
        while num >= 2:
            temp = num % 2
            if not temp:
                res += 2 ** pos
            num //= 2
            pos += 1
        return res

第三种解法

class Solution:
    def findComplement(self, num: int) -> int:
        s = bin(num)[2:]
        b = ""
        for ch in s:
            if ch == "0":
                b+= "1"
            else:
                b += "0"
        return int(b,2)

image.png

解题思路:第一种解法:我们先将这个十进制的数字通过取余的方式转换成二进制,然后我们将他进行按位取反,在将取反后的数字变成十进制,主要是取余变换进制的操作和累乘换成10进制的操作需要学习;第二种解法(高效):我们将一个数字取反,原本的位置是1,取反变成0,在还原成十进制的时候没用,可以直接不进行计算,所以我们只关注0的位置,取余的时候得到的二进制是从后向前的,我们使用pos记录得到0的位置,在该位置乘数是2 ** pos,所以比较高效的得到了取反后的数字;第三种解法:我们使用bin和int的方式将完成二进制和十进制的转换,比较简单。