思路:
-
特殊情况处理
- 根据题目所示,二进制的反码表示是将每个
1变为0,每个0变为1。 - 所以先将一位数的0和1直接返回各自的反码。
- 根据题目所示,二进制的反码表示是将每个
在python中可以通过2种方式实现十进制转换为二进制:
- 定义栈实现
- 用python的内置函数bin()实现
这里主要使用第一种方法,定义栈实现。
栈是一种后进先出的数据结构,在这里可以用来将 N 的二进制位逆序存储。
十进制N转化为二进制反码
-
首先,定义一个空栈s,用于存储N的二进制反码
-
将整数 N 转换为二进制反码:
-
得到
N的二进制最低位。每次取N的最后一位(N % 2),可以得到。 -
获取当前
N的二进制最低位的反码- 如果为1,则反码为0
- 如果为0,则反码为1
-
将当前
N的二进制最低位的反码压入栈s中 -
然后将
N右移一位(N //= 2),每次循环都会获取下一位的二进制在反码值 -
重复以上步骤,直到
N为0。这样可以得到N的二进制反码表示,但位顺序是从低位到高位的。
-
N的二进制反码转换为十进制数
-
首先定义一个变量ans,并初始化为0,这是最后的返回值
-
判断栈s的长度是否大于0,也就是判断栈s是否存在
-
若存在,将反码转换回十进制:
- 如果ans的值为0
- 则将反码的二进制位从栈中按顺序弹出。
- 如果ans的值为非0
- 则先将ans本身乘2,再将反码的二进制位从栈中按顺序弹出,使用二进制转十进制的方法,逐位累加计算反码的十进制值。
以下是代码
def solution(N: int) -> int:
# write code here
if N == 1:
return 0
elif N == 0:
return 1
# 栈
s = []
while N > 0:
rem = N%2
if rem == 0:
rem=1
else:
rem=0
s.append(rem)
N = N//2
ans = 0
while len(s)>0:
if ans == 0:
ans += s.pop()
else:
ans = ans*2 +s.pop()
return ans # Placeholder return
if __name__ == '__main__':
print(solution(N=5) == 2)
print(solution(N=10) == 5)
print(solution(N=0) == 1)