豆包MarsCode 刷题(三) | 豆包MarsCode AI刷题

77 阅读5分钟

本博客含有两道题目:最少步数归零问题;字典序最小的01字符串

最少步数归零问题

问题描述

小R拿到了一个长度为n的数组,其中每个元素都是一个正整数。小R发现每次可以删除某个数组中某个数的一位数字,这样可以逐步将所有数字变为0。他想知道,要将数组中所有数字都变为0,最少需要多少步?

例如:对于数字 103,小R可以选择删除第1位数字,将其变为 3;或者删除第2位数字,变为 13,又或者删除第3位数字,将其变为 10。最终目标是将所有数字都删除为0。

我的思路

  • 首先对数组中的数字进行遍历
  • 然后统计每个数字的位数以及包含数字0的个数
  • 最终返回的结果是数组中所有数字的位数减去数字0的个数。

MarsCode AI的思路

  • 遍历数组中的每个数字。
  • 对于每个数字,计算其长度(即位数)。
  • 将所有数字的长度相加,得到最少需要的操作次数。

对比思路之后,发现AI的思路有些问题,并没有起到优化我的思路的过程。

编程并使用MarsCode AI进行优化

以下是针对我的思路进行了代码编写

def solution(n: int, a: list) -> int:
    # 初始化一个变量来存储总操作次数
    total_steps = 0
    
    # 遍历数组中的每个数字
    for num in a:
        # 计算当前数字的长度
        num_length = len(str(num))
        
        # 统计当前数字中包含数字0的个数
        zero_count = str(num).count('0')
        
        # 将当前数字的长度减去包含数字0的个数,加到总操作次数中
        total_steps += (num_length - zero_count)
    
    # 返回总操作次数
    return total_steps
​
豆包代码:
def solution(n: int, a: list) -> int:
    # 初始化一个变量来存储总操作次数
    total_steps = 0
    
    # 遍历数组中的每个数字
    for num in a:
        # 将数字转换为字符串
        num_str = str(num)
        
        # 计算当前数字的长度
        num_length = len(num_str)
        
        # 统计当前数字中包含数字0的个数
        zero_count = num_str.count('0')
        
        # 将当前数字的长度减去包含数字0的个数,加到总操作次数中
        total_steps += (num_length - zero_count)
    
    # 返回总操作次数
    return total_steps

然后我继续使用MarsCode AI进行优化我的代码,跟着豆包继续学习良好的编程习惯,在优化过程中,豆包给我提出了一些建议:

  • 减少不必要的类型转换:在每次循环中,将数字转换为字符串两次(一次用于计算长度,一次用于统计0的个数)。我们可以将数字转换为字符串一次,然后复用这个字符串。 (接受建议)
  • 简化代码结构:可以将一些操作合并,使代码更简洁。 (接受建议)

字典序最小的01字符串

问题描述

小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。

例如,小U当前有一个字符串 01010,她最多可以进行 2 次相邻字符交换操作。通过这些操作,她可以将字符串调整为 00101,这是可以通过不超过2次操作得到的字典序最小的字符串。

现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。

我的思路

  • 从左向右遍历整个字符串
  • 如果这个位置的数字是0或者这个位置是1且右边位置也是1,则遍历下一个位置的数字
  • 如果这个位置是1且右边位置是0,则进行一次交换,然后遍历下一个位置的数字。
  • 结束条件:遍历结束或者交换次数用完

MarsCode AI的思路

  1. 初始化:将字符串转换为字符数组。
  2. 遍历字符数组:从左到右遍历字符数组,尝试将当前位置的 '0' 尽可能地向左移动。
  3. 交换操作:每次找到一个 '0',尝试将其向左移动,直到达到 k 次操作的限制。
  4. 更新操作次数:每次交换操作后,减少 k 的值。
  5. 返回结果:将字符数组转换回字符串并返回。

思路对比:与豆包的思路进行对比之后。发现我的思路存在问题,在遇到 '1' 且右边是 '0' 时进行交换后,不能确保是最小的,可以继续检查当前位置是否可以继续向左移动 '0',直到无法再移动为止,采纳豆包的思路之后可以确保每次交换都能尽可能地将 '0' 向左移动,从而达到字典序最小的目标。

编程并使用MarsCode AI进行优化

编程之后利用豆包进行一系列的优化,得到下述代码:

def solution(n: int, k: int, s: str) -> str:
    # 将字符串转换为字符数组,方便进行交换操作
    chars = list(s)
    
    # 遍历字符数组
    for i in range(n):
        # 如果当前字符是 '0',则尝试将其向左移动
        if chars[i] == '0':
            # 从当前位置向左遍历,尝试将 '0' 向左移动
            for j in range(i, 0, -1):
                # 如果当前位置是 '1' 且左边位置是 '0',则进行交换
                if chars[j] == '0' and chars[j - 1] == '1':
                    # 进行交换操作
                    chars[j], chars[j - 1] = chars[j - 1], chars[j]
                    # 减少操作次数
                    k -= 1
                    # 如果操作次数用完,直接返回结果
                    if k == 0:
                        return ''.join(chars)
                else:
                    # 如果无法继续向左移动,跳出循环
                    break
    
    # 返回最终结果
    return ''.join(chars)