"负二进制表示问题”解题方法和心得|豆包MarsCode AI刷题

54 阅读4分钟

首先,通过简单的课程教学和刷题训练,我对编程有了一定的了解。因此选择了一些简单的题目和大家分享一下。

这道题目书记了几个关键编程和数学知识点,大概有负数进制表示、模运算和整除、列表和字符串操作、函数封装等。

题目分析 本题要求将给定的整数 n 转换为负二进制形式的字符串。负二进制与传统二进制的区别在于其基数为 -2而非通常的2,数位权值按照(-2)^i  计算。需要注意的是,除结果为 “0” 外,返回字符串不能有前导零。

解决思路 我们可以通过不断地对 n 进行除以 -2 的运算来获取每一位的数字。在这个过程中,需要处理余数可能为负数的特殊情况。当余数为负时,需要将余数调整为正数(通过加上 2),同时要对商进行相应的调整(加 1),以符合负二进制的运算规则。然后将得到的余数从低位到高位依次构建成字符串。

以下是我编写的代码实现:

def adjust_remainder(remainder: int, n: int) -> (int, int):
    # 如果余数为负数,调整余数和商
    if remainder < 0:
        remainder += 2
        n += 1
    return remainder,
def solution(n: int) -> str:
    if n == 0:
        return "0"
    result = []
    while n != 0:
        remainder = n % -2
        n = n // -2
        # 调整余数和商
        remainder, n = adjust_remainder(remainder, n)
        # 将当前位的值添加到结果列表
        result.append(str(remainder)) 
    # 反转结果列表并拼接成字符串
    return ''.join(result[::-1])
if __name__ == '__main__':
    # 添加更多的测试用例
    print(solution(n=2) == '110')
    print(solution(n=3) == '111')
    print(solution(n=0) == '0')
    print(solution(n=-1) == '11')  # 添加负数测试用例
    print(solution(n=10) == '11110')  # 添加较大正数测试用例
    print(solution(n=-10) == '11010')  # 添加较大负数测试用例

思路分析

  1. 处理负余数: -在负二进制转换中,余数可能会是负数。你需要确保余数始终为非负数,并且调整商(n)以保持正确性。

  2. 反转结果列表: -由于我们是从低位到高位计算每一位的值,最后需要将结果列表反转,以得到正确的负二进制表示。

  3. 特殊情况处理: -当输入为 0 时,直接返回 0

def adjust_remainder(remainder: int, n: int) -> (int, int):
    if remainder < 0:
        remainder += 2
        n += 1
    return remainder, n

def solution(n: int) -> str:
    if n == 0:
        return "0"
    
    result = []
    while n != 0:
        remainder = n % -2
        n = n // -2
        
        remainder, n = adjust_remainder(remainder, n)
        
        result.append(str(remainder))
    
    return ''.join(result[::-1])

if __name__ == '__main__':
    # 正数测试用例
    print(solution(n=2) == '110')
    print(solution(n=3) == '111')
    print(solution(n=10) == '11110')
    
    # 负数测试用例
    print(solution(n=-1) == '11')
    print(solution(n=-10) == '11010')
    
    # 零测试用例
    print(solution(n=0) == '0')

知识总结

1.进制转换基础:本题涉及到非标准的进制转换知识。一般的进制转换思路(如十进制转二进制)是通过不断除以目标进制数取余数来实现,但负二进制由于基数为负,需要额外处理余数为负的情况。

2.数学运算规则:理解除法和取模运算在负整数情况下的表现。同时,要掌握在负二进制中对负数余数的调整规则,这是基于负进制数的数学原理,即保证计算结果符合  的数位权值计算方式。 学习心得

1.深入理解数学概念与编程的结合:这个问题让我深刻体会到数学概念在编程中的应用。看似简单的进制转换,在引入负进制后变得复杂,需要准确地将数学规则转化为代码逻辑。这使我明白在解决编程问题时,对相关数学知识的深入理解是非常关键的。

2.特殊情况处理的重要性:像处理余数为负以及前导零的问题,在编程中是很容易被忽略但又非常重要的细节。这提醒我在编写代码时要充分考虑各种可能的边界情况,确保程序的正确性和稳定性。通过对这些特殊情况的处理,也让我对问题的理解更加全面。

3.代码优化和简洁性的思考:在实现功能的基础上,可以进一步思考代码是否可以更简洁、更高效。虽然当前的代码已经能够正确地解决问题,但也许还有其他更优的算法或者数据结构可以用来改进这个函数,这也是在编程学习中持续追求的目标之一。