Number Complement,LeetCode,476

LeetCode 476题是关于求数的补数的问题。题目描述如下:

题目描述: 给定一个正整数,输出它的补数。补数的定义是:该数和它的补数进行按位异或(XOR)运算的结果为所有位都为1的二进制数。

示例:

输入:5 输出:2 解释:5的二进制表示为101,其补数为010。101和010进行按位异或运算的结果为111。

解题思路:

  1. 确定二进制长度:首先需要确定输入数字的二进制长度,这样才能构造出所有位都为1的二进制数。
  2. 构造全1二进制数:根据确定的长度,构造一个所有位都为1的二进制数。
  3. 计算补数:使用按位异或运算,将输入数字与全1二进制数进行异或,得到的结果即为补数。

具体步骤:

  1. 计算输入数字的二进制长度。
  2. 构造一个与该长度相同的全1二进制数。
  3. 使用按位异或运算得到补数。

代码实现(Python):

class Solution: def findComplement(self, num: int) -> int:

Step 1: Determine the length of the binary representation of num

    length = len(bin(num)) - 2

    # Step 2: Create a bitmask with all bits set to 1 of the same length
    bitmask = (1 << length) - 1

    # Step 3: Compute the complement by XORing num with the bitmask
    complement = num ^ bitmask

    return complement

解释:

  1. len(bin(num)) - 2bin(num)返回num的二进制字符串,len(bin(num))获取该字符串的长度,减去2是因为bin()函数返回的字符串包含前缀'0b'
  2. 1 << length:将1左移length位,得到一个所有位都为0,只有最高位为1的数。
  3. (1 << length) - 1:将上一步得到的数减去1,得到一个所有位都为1的数。
  4. num ^ bitmask:使用按位异或运算得到补数。

复杂度分析:

  • 时间复杂度:O(1),因为二进制长度和操作都是常数时间。
  • 空间复杂度:O(1),只使用了常数额外空间。

这个解法简洁高效,充分利用了位运算的特性来解决问题。希望这个详细的解释对你理解这道题有所帮助!如果有任何进一步的问题,欢迎继续提问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注