二进制反码转换问题 | 豆包MarsCode AI刷题

134 阅读2分钟

二进制反码转换问题 - MarsCode

思路:

  • 特殊情况处理

    • 根据题目所示,二进制的反码表示是将每个 1 变为 0,每个 0 变为 1
    • 所以先将一位数的0和1直接返回各自的反码。

在python中可以通过2种方式实现十进制转换为二进制:

  1. 定义栈实现
  2. 用python的内置函数bin()实现

这里主要使用第一种方法,定义栈实现。

栈是一种后进先出的数据结构,在这里可以用来将 N 的二进制位逆序存储。

十进制N转化为二进制反码

  • 首先,定义一个空栈s,用于存储N的二进制反码

  • 将整数 N 转换为二进制反码

    • 得到 N 的二进制最低位。每次取 N 的最后一位(N % 2),可以得到。

    • 获取当前 N 的二进制最低位的反码

      • 如果为1,则反码为0
      • 如果为0,则反码为1
    • 将当前 N 的二进制最低位的反码压入栈s中

    • 然后将 N 右移一位(N //= 2),每次循环都会获取下一位的二进制在反码值

    • 重复以上步骤,直到 N0。这样可以得到 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)