青训营X豆包MarsCode 技术训练营刷题| 豆包MarsCode AI 刷题

84 阅读4分钟

题目解析:负二进制表示法

题目描述

给定一个整数 n,需要将其转换为负二进制(base -2)表示,并返回相应的二进制字符串。需要注意的是,返回的字符串中不能有前导零,除非结果是 "0"。

负二进制简介

负二进制是一种特殊的进制表示方法,其基数为 -2。在这种表示法中,每一位的权值是 (-2)^i,其中 i 是该位的位置(从右到左,从 0 开始计数)。与传统的二进制不同,负二进制允许更灵活的表示方式,能够用更少的位表示某些负数。

思路

为了将整数 n 转换为负二进制,可以采用以下步骤:

  1. 处理特殊情况:如果 n 为 0,直接返回 "0"。

  2. 迭代计算

    • 使用循环计算当前位的值(余数),并更新 n(商)。
    • 当余数为负时,需要进行调整,使其变为非负数,并相应地调整商。
  3. 构建结果:将每次计算得到的位存储起来,最后反转得到的结果列表并连接成字符串。

图解

以下是基于整数 n 的负二进制转换的图解示例:

假设 n = 3,我们可以通过以下步骤进行转换:

  1. 第一次迭代:

    • n = 3
    • 计算 3 % -2 得到余数 -1,商为 -1(因为 3 = (-2) * -1 + -1)。
    • 调整余数:-1 + 2 = 1,同时商 n 增加 1,变为 0
    • 结果列表 [1]
  2. 第二次迭代:

    • n = 0
    • 计算 0 % -2 得到余数 0,商为 0
    • 结果列表 [1, 1]
  3. 结束:反转结果并连接,得到 "111"。

代码详解

下面是解决方案的实现代码:

def solution(n: int) -> str:
    if n == 0:
        return "0"
    
    result = []
    
    while n != 0:
        n, remainder = divmod(n, -2)
        
        # Adjust the remainder if it's negative
        if remainder < 0:
            remainder += 2
            n += 1
        
        result.append(str(remainder))
    
    # The result is built in reverse order
    return ''.join(result[::-1])

# Testing
if __name__ == '__main__':
    print(solution(n=2) == '110')  # 2 in base -2 is 110
    print(solution(n=3) == '111')  # 3 in base -2 is 111
    print(solution(n=0) == '0')     # 0 in base -2 is 0

代码解析

  1. 特殊情况处理

    • 首先检查 n 是否为 0,如果是,返回字符串 "0"。
  2. 循环计算

    • 使用 divmod(n, -2) 计算商和余数。divmod 返回的是 (商, 余数)
    • 如果余数为负,调整余数为正,同时增加商 n
  3. 结果构建

    • 将每次迭代得到的余数加入到结果列表中。
    • 最后反转列表并连接成字符串,得到最终的负二进制表示。

通过上述步骤,我们能够有效地将任意整数转换为负二进制表示。这种表示法在某些情况下比传统的二进制更为紧凑和方便,特别是在处理负数时。

学习计划:高效利用豆包MarsCode AI

在刷题过程中,我总结出以下高效学习方法:

明确目标,规划时间

  • 每天刷题:设定每天刷题3-5道,涵盖不同难度级别(简单-中等-困难)。可以使用豆包MarsCode AI的“每日推荐”功能制定目标,并合理分配时间。

深度解析,记录错题

  • 关注错题:对于错题,重点分析思路和实现过程的差距。利用豆包MarsCode的详细解析功能,找到自己的薄弱环节,并记录在笔记中。

难点拆解,逐步突破

  • 小任务拆解:将较复杂的题目拆解为小任务,利用AI的提示功能逐步解决,增强理解和掌握。

错题学习建议

  • 定期回顾:定期回顾错题,强化容易出错的知识点。
  • 对比分析:对比自己的代码与解析代码,找出实现上的差异,提升代码质量。

工具运用:整合学习资源

豆包MarsCode AI 在刷题中提供了详细的题解和智能提示功能,可以结合以下资源进行更全面的学习:

参考书籍

  • 经典书籍:如《算法导论》《程序员面试金典》等,提升理论深度和知识广度。

在线文档和视频

  • 结合教程:利用LeetCode、YouTube等平台的算法教程,与豆包MarsCode的解析进行互补,强化理解。

实践项目

  • 应用所学:将刷题中学到的知识应用于实践项目,进一步巩固理解和应用能力。

总结

通过使用豆包MarsCode AI 刷题工具,我在解题效率、知识总结和错题分析上取得了显著提升。未来的学习计划将继续结合AI的智能功能和经典资源,进一步夯实基础知识并攻克高难度题目。