题解:二进制反码的十进制表示
问题描述
小C在学习二进制运算,他了解到每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制“101”,整数 11 可以被表示为二进制“1011”,并且除了 N = 0 外,任何二进制表示中都不会简单零。
二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数“101”的二进制反码为“010”。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。
测试样例
- 样例1:
- 输入:N = 5
- 输出:2
- 样例2:
- 输入:N = 10
- 输出:5
- 样例3:
- 输入:N = 0
- 输出:1
解题思路
- 二进制表示:首先,我们需要将给定的十进制数 N 转换为二进制表示。Python 提供了内置函数
bin()来完成这个任务。bin(N)返回一个以0b开头的字符串,表示 N 的二进制形式。 - 反码计算:接下来,我们需要计算二进制数的反码。反码的计算可以通过遍历二进制字符串,将每个
1变为0,每个0变为1来实现。 - 转换为十进制:最后,将反码的二进制字符串转换回十进制数。Python 提供了内置函数
int(binary_string, 2)来完成这个任务,其中binary_string是二进制字符串,2表示基数为 2。
代码实现
def solution(N: int) -> int:
if N == 0:
return 1
# 将十进制数转换为二进制字符串
binary_str = bin(N)[2:]
# 计算反码
inverse_binary_str = ''.join('1' if bit == '0' else '0' for bit in binary_str)
# 将反码的二进制字符串转换为十进制数
inverse_decimal = int(inverse_binary_str, 2)
return inverse_decimal
# 测试样例
print(solution(5)) # 输出:2
print(solution(10)) # 输出:5
print(solution(0)) # 输出:1
代码解析
特殊情况处理:
如果输入的 N 为 0,直接返回 1。因为 0 的二进制表示为 0,其反码为 1,对应的十进制数为 1。
if N == 0:
return 1
二进制转换:
使用 bin(N)[2:] 将十进制数 N 转换为二进制字符串,并去掉前缀 0b。
python
复制代码
binary_str = bin(N)[2:]
反码计算:
使用列表推导式遍历二进制字符串,将每个 1 变为 0,每个 0 变为 1,并拼接成新的反码字符串。
python
复制代码
inverse_binary_str = ''.join('1' if bit == '0' else '0' for bit in binary_str)
十进制转换:
使用 int(inverse_binary_str, 2) 将反码的二进制字符串转换为十进制数。
python
复制代码
inverse_decimal = int(inverse_binary_str, 2)
复杂度分析
- 时间复杂度:O(log N),其中 N 是输入的十进制数。时间复杂度主要取决于二进制字符串的长度,而二进制字符串的长度与 N 的位数成正比,即 log N。
- 空间复杂度:O(log N),主要的空间开销在于存储二进制字符串和反码字符串。
总结
本题的核心在于如何将十进制数转换为二进制表示,计算其反码,并将反码转换回十进制数。通过 Python 的内置函数 bin() 和 int(),可以高效地完成这些任务。最终的代码简洁明了,易于理解和维护。