LeetCode 476题是关于求数的补数的问题。题目描述如下:
题目描述: 给定一个正整数,输出它的补数。补数的定义是:该数和它的补数进行按位异或(XOR)运算的结果为所有位都为1的二进制数。
示例:
输入:5
输出:2
解释:5的二进制表示为101,其补数为010。101和010进行按位异或运算的结果为111。
解题思路:
- 确定二进制长度:首先需要确定输入数字的二进制长度,这样才能构造出所有位都为1的二进制数。
- 构造全1二进制数:根据确定的长度,构造一个所有位都为1的二进制数。
- 计算补数:使用按位异或运算,将输入数字与全1二进制数进行异或,得到的结果即为补数。
具体步骤:
- 计算输入数字的二进制长度。
- 构造一个与该长度相同的全1二进制数。
- 使用按位异或运算得到补数。
代码实现(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
解释:
len(bin(num)) - 2
:bin(num)
返回num的二进制字符串,len(bin(num))
获取该字符串的长度,减去2是因为bin()
函数返回的字符串包含前缀'0b'
。1 << length
:将1左移length
位,得到一个所有位都为0,只有最高位为1的数。(1 << length) - 1
:将上一步得到的数减去1,得到一个所有位都为1的数。num ^ bitmask
:使用按位异或运算得到补数。
复杂度分析:
- 时间复杂度:O(1),因为二进制长度和操作都是常数时间。
- 空间复杂度:O(1),只使用了常数额外空间。
这个解法简洁高效,充分利用了位运算的特性来解决问题。希望这个详细的解释对你理解这道题有所帮助!如果有任何进一步的问题,欢迎继续提问。
发表回复