负二进制表示问题(青训营X豆包MarsCode) | 豆包MarsCode AI 刷题

76 阅读3分钟

问题描述

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

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

测试样例

样例1:

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

样例2:

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

样例3:

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

负二进制(base -2)的表示方法与普通二进制有所不同。在负二进制中,每一位的权值是 ((-2)^i),其中 (i) 是从右到左的位数索引(从0开始)。为了将一个整数 (n) 转换为负二进制表示,我们可以使用类似于普通二进制转换的方法,但需要注意处理负权值带来的影响。

转换步骤

  1. 初始化
    • 创建一个空字符串 result 用于存储结果。
    • 使用一个循环,直到 (n) 变为0。
  1. 计算余数
    • 计算 (n) 除以 -2 的余数 r
    • 如果余数 r 为负数,则需要调整 (n) 和 r,使得 r 变为非负数。
  1. 更新 ( n )
    • 如果 r 为负数,将 (n) 增加1,同时将 r 加2,以确保 r 为非负数。
    • r 转换为字符串并添加到 result 的前面。
  1. 处理前导零
    • 如果结果字符串为空,返回 "0"。
    • 否则,返回结果字符串。

代码实现

def to_negabinary(n):
    if n == 0:
        return "0"
    
    result = ""
    
    while n != 0:
        n, remainder = divmod(n, -2)
        if remainder < 0:
            n, remainder = n + 1, remainder + 2
        result = str(remainder) + result
    
    return result

# 测试样例
print(to_negabinary(2))  # 输出:'110'
print(to_negabinary(3))  # 输出:'111'
print(to_negabinary(0))  # 输出:'0'

解释

  1. 初始化
    • 如果 n 为0,直接返回 "0"。
  1. 循环转换
    • 使用 divmod 函数计算 n 除以 -2 的商和余数。
    • 如果余数 r 为负数,调整 nr,使得 r 为非负数。
    • r 转换为字符串并添加到 result 的前面。
  1. 返回结果
    • 返回结果字符串 result

通过这种方法,我们可以将任何整数 (n) 转换为负二进制表示,并确保结果字符串中不包含前导零。

经验&技巧

理解负二进制概念
  • 明确负二进制与普通二进制的区别,其数位权值按计算,这是解题的基础,要深刻理解这种特殊进制下数字表示的原理。
掌握转换步骤
  1. 初始化环节

    • 记住创建空字符串result用于存储结果,并通过循环直至n变为 0 来完成转换过程。
  2. 计算余数部分

    • 准确计算n除以 -2 的余数r,同时注意当余数为负时的特殊处理情况。
  3. 更新n和余数r

    • r为负,要按照规则增加n的值和调整r的值,保证r非负,然后将r转换为字符串添加到result前面。
  4. 处理前导零

    • 最后要考虑结果字符串为空的特殊情况,若为空则返回 "0",否则返回结果字符串。
代码实现与理解
  • 在代码实现中,首先处理n = 0的特殊情况直接返回 "0"。在循环中使用divmod函数高效计算商和余数,并根据余数正负进行相应调整,最后返回result。理解代码的每一步操作有助于更好地应对类似题目,并且在刷题过程中可以多尝试不同的测试样例来验证代码的正确性。