青训营X豆包MarsCode技术训练营伴学笔记|实践记录以及工具使用(2)|豆包MarsCode AI刷题

125 阅读7分钟

在这篇伴学笔记中,我想对使用豆包MarsCode AI刷题平台的几个功能进行总结与整理。 下面我将用一道具体的算法题进行举例说明。

一、题目描述

小C发现了一种特殊的数字,称为类二进制数字,即仅由数字0和1组成的十进制数。例如,1011100都是类二进制数字,而1123001则不是。现在,小C手上有一个正整数n,他想知道最少需要多少个类二进制数字相加才能得到n

测试样例

样例1:

输入:n = "10101"
输出:1

样例2:

输入:n = "212"
输出:2

样例3:

输入:n = "1000000"
输出:1

样例4:

输入:n = "123456789"
输出:9

样例5:

输入:n = "9876543210"
输出:9

二、功能解析

1. 思路提示

当我拿到这道题目时,如果发现一点思路也没有,可以点击平台右侧的AI对话框,里面有一个选项“需要一点思路提示”,这样在对话框中就会生成一些关于这道题目的思路提示。这个提示并不会直接告诉我代码该如何编写,而是一种思路上的开拓,找到这个问题的切入点。

当我点击“需要思路提示后”,AI便帮我生成了如下的的思路提示:

问题理解

我们需要找到最少的类二进制数字(即仅由0和1组成的数字),使得它们的和等于给定的正整数 n

解题思路

(1) 类二进制数字的特性

-   类二进制数字只包含0和1。
-   例如,1, 10, 11, 100, 101, 110, 111 等都是类二进制数字。

(2) 目标

-   我们需要找到最少的类二进制数字,使得它们的和等于 `n`

(3) 贪心策略

-   从 `n` 中减去最大的类二进制数字,直到 `n` 变为0。
-   每次减去的类二进制数字应该是小于或等于 `n` 的最大类二进制数字。

(4) 具体步骤

-   将 `n` 转换为字符串形式,以便于处理每一位。
-   从最高位开始,尝试构造最大的类二进制数字。
-   每次找到一个类二进制数字后,从 `n` 中减去该数字,并记录减去的次数。
-   重复上述步骤,直到 `n` 变为0。
数据结构选择
  • 使用字符串来处理 n 的每一位。
  • 使用整数来记录减去的次数。
算法步骤

(1) 初始化一个计数器 count 用于记录减去的次数。

(2) 当 n 不为0时,执行以下步骤:

-   找到小于或等于 `n` 的最大类二进制数字。
-   从 `n` 中减去该数字。
-   增加计数器 `count`

(3) 返回计数器 count

通过上述思路,你可以逐步实现代码来解决这个问题。如果你有任何具体的问题或需要进一步的代码提示,请告诉我!

2. 代码提示

怎么样?是不是非常的 amazing! 思路是不是一下子就有了?

但是如果这个时候,有思路了,但是代码不知道从哪儿下手,还可以继续点击对话框里面的“给我一些代码提示”,AI将会继续生成这道题目的代码提示。当然AI不会直接告诉你代码怎么写,而是给你提示。

下面就是AI生成的代码提示。

代码提示

(1) 函数签名

-   你已经定义了一个函数 `solution(n: str) -> int`,这个函数签名是正确的。

(2) 初始化计数器

-   你需要一个计数器来记录减去的次数。

(3) 处理每一位

-   你需要遍历 `n` 的每一位,尝试构造最大的类二进制数字。

(4) 构造类二进制数字

-   对于每一位,尝试构造一个类二进制数字,并从 `n` 中减去该数字。

(5) 更新 n

-   每次减去一个类二进制数字后,更新 `n` 并增加计数器。
代码框架
def solution(n: str) -> int:
    # 初始化计数器
    count = 0
    
    # 将 n 转换为整数以便于处理
    n = int(n)
    
    # 当 n 不为0时,执行以下步骤
    while n > 0:
        # 找到小于或等于 n 的最大类二进制数字
        # 这里需要实现一个逻辑来找到最大的类二进制数字
        max_binary_like_number = find_max_binary_like_number(n)
        
        # 从 n 中减去该数字
        n -= max_binary_like_number
        
        # 增加计数器
        count += 1
    
    return count

# 辅助函数:找到小于或等于 n 的最大类二进制数字
def find_max_binary_like_number(n: int) -> int:
    # 这里需要实现一个逻辑来找到最大的类二进制数字
    # 例如,从 n 的最高位开始,尝试构造最大的类二进制数字
    # 返回该数字
    pass

if __name__ == '__main__':
    print(solution("10101") == 1)
    print(solution("212") == 2)
    print(solution("1000000") == 1)
    print(solution("123456789") == 9)
    print(solution("9876543210") == 9)
关键步骤

(1) find_max_binary_like_number 函数

-   这个函数需要实现一个逻辑来找到小于或等于 `n` 的最大类二进制数字。
-   你可以从 `n` 的最高位开始,尝试构造最大的类二进制数字。

(2) 更新 n

-   每次找到一个类二进制数字后,从 `n` 中减去该数字,并增加计数器。
示例

假设 n 是 "123456789":

  • 第一次找到的最大类二进制数字是 "100000000"(即1亿)。
  • 从 "123456789" 中减去 "100000000",得到 "23456789"。
  • 继续找到下一个最大的类二进制数字,直到 n 变为0。

通过上述提示,你可以逐步实现代码来解决这个问题。如果你有任何具体的问题或需要进一步的代码提示,请告诉我!

三、代码编写

至此,AI已经帮我把这道题目的思路和代码框架搭建好了,剩下的就是根据AI给出的提示,往里面填充代码即可。整个事情一下子变得简单了起来。下面是我根据AI提示写出的代码。

def solution(n: str) -> int:
    # 初始化计数器
    count = 0
    
    # 将 n 转换为整数以便于处理
    n = int(n)
    
    # 当 n 不为 0 时,执行以下步骤
    while n > 0:
        # 找到小于或等于 n 的最大类二进制数字
        max_binary_like_number = find_max_binary_like_number(n)
        
        # 从 n 中减去该数字
        n -= max_binary_like_number
        
        # 增加计数器
        count += 1
    
    return count

# 辅助函数:找到小于或等于 n 的最大类二进制数字
def find_max_binary_like_number(n: int) -> int:
    # 将 n 转为字符串便于逐位处理
    n_str = str(n)
    
    # 构造类二进制数字
    result = []
    for char in n_str:
        if char > '0':  # 如果当前位大于 0,则该位置为 1
            result.append('1')
        else:           # 否则为 0
            result.append('0')
    
    # 将结果拼接成整数返回
    return int(''.join(result))

当我运行代码,顺利通过了测试样例,并成功提交。

四、总结

通过豆包MarsCode AI刷题平台,我们可以看到AI刷题的强大之处,它不仅向我们提供思路提示,更给我们提供代码框架,我们需要做的就是往框架里面填写代码并添加一些自己的思考,这极大程度地提高了我们编写代码的效率,同时也拓宽了我们编写代码的思路。跟随AI刷题的步伐,我们的写代码的能力也会越来越强。