负二进制表示问题 | 豆包MarsCode AI刷题

90 阅读1分钟

问题描述

小U最近了解到负二进制(base -2)的表示方法。现在给定一个整数 n,小U希望将该整数以负二进制的形式表示,并返回其对应的二进制字符串。注意,除非结果是 "0",否则返回的字符串中不能包含前导零。

负二进制是一种非标准的进制表示,使用基数 -2 而非通常的 2。在负二进制中,数位的权值是按 (-2)^i 来计算的。


测试样例

样例1:

输入:n = 2 输出:'110'

样例2:

输入:n = 3 输出:'111'

样例3:

输入:n = 0 输出:'0'

解题思路

  1. 理解负二进制表示法

    • 在负二进制中,每一位的权值是 (-2)^i,其中 i 是位数(从右到左,从0开始计数)。
    • 例如,110 在负二进制中表示 1*(-2)^2 + 1*(-2)^1 + 0*(-2)^0 = 4 - 2 + 0 = 2
  2. 转换方法

    • 我们可以通过不断除以 -2 并记录余数的方式来转换。

    • 具体步骤如下:

      1. 初始化一个空列表来存储余数。

      2. n 不为0时,进行以下操作:

        • 计算 n % -2 得到余数。
        • 如果余数为负数,将其调整为正数,并将 n 加1(因为 -2 的倍数需要调整为正数)。
        • 将余数添加到列表中。
        • 更新 nn // -2
      3. 将列表中的余数反转,并转换为字符串。

  3. 特殊情况

    • 如果 n 为0,直接返回 '0'
def solution(n: int) -> str:
    if n == 0:
        return '0'
    res = []
​
    while n:
        r = n % -2
        n //= -2
        if r < 0:
            r += 2
            n += 1
        res.append(str(r))
    return ''.join(res[::-1])
​
​
if __name__ == '__main__':
    print(solution(n=2) == '110')
    print(solution(n=3) == '111')
    print(solution(n=0) == '0')