问题描述
小U最近了解到负二进制(base -2)的表示方法。现在给定一个整数 n,小U希望将该整数以负二进制的形式表示,并返回其对应的二进制字符串。注意,除非结果是 "0",否则返回的字符串中不能包含前导零。
负二进制是一种非标准的进制表示,使用基数 -2 而非通常的 2。在负二进制中,数位的权值是按 (-2)^i 来计算的。
测试样例
样例1:
输入:
n = 2输出:'110'
样例2:
输入:
n = 3输出:'111'
样例3:
输入:
n = 0输出:'0'
解题思路
-
理解负二进制表示法:
- 在负二进制中,每一位的权值是
(-2)^i,其中i是位数(从右到左,从0开始计数)。 - 例如,
110在负二进制中表示1*(-2)^2 + 1*(-2)^1 + 0*(-2)^0 = 4 - 2 + 0 = 2。
- 在负二进制中,每一位的权值是
-
转换方法:
-
我们可以通过不断除以
-2并记录余数的方式来转换。 -
具体步骤如下:
-
初始化一个空列表来存储余数。
-
当
n不为0时,进行以下操作:- 计算
n % -2得到余数。 - 如果余数为负数,将其调整为正数,并将
n加1(因为-2的倍数需要调整为正数)。 - 将余数添加到列表中。
- 更新
n为n // -2。
- 计算
-
将列表中的余数反转,并转换为字符串。
-
-
-
特殊情况:
- 如果
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')