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

136 阅读4分钟

本博客含有两道题目:唐门绝技——暴雨梨花针最少发射次数;构造特定数组的逆序拼接

唐门绝技:暴雨梨花针最少发射次数

问题描述

在唐门,外门弟子唐三发现了一种强大的暗器技巧,名为暴雨梨花针,它能在一条直线上摧毁所有目标。唐三在一本古籍中学习到了这门技巧,为了练习,他设置了若干个靶子在二维平面上。每个靶子是一条垂直于X轴的线段,由三个参数 x_{left}x_{right}y 描述,其中 y 是固定的高度,x_{left}x_{right} 表示线段在X轴上的起止位置。

唐三的目标是使用尽可能少的暴雨梨花针来击中所有靶子。由于暴雨梨花针的珍贵,每次射击必须经济有效。每次射击暴雨梨花针都将从某个 x 值发射,能垂直上升到 y = 100

请你帮助唐三计算最少需要多少次射击,才能保证击中所有靶子。结果需对给定的 P 取余。

本题思路:

1、首先对靶子的右边位置进行从小到大的排序(因为靶子右边位置可以涉及到多个靶子连续命中)。这样做的目的是为了确保在每次射击时,能够尽可能多地覆盖到靶子。

2、初始化一个变量 arrows 用于记录射击次数,初始值为0。初始化一个变量 last_position 用于记录当前射击的位置,初始值为第一个靶子的右边位置。

3、遍历排序后的靶子列表:

如果当前靶子的左边位置小于等于 last_position,说明这个靶子已经被当前射击覆盖,继续遍历下一个靶子。

如果当前靶子的左边位置大于 last_position,说明需要进行新的射击。此时,增加 arrows 的值,并将 last_position 更新为当前靶子的右边位置。

4、结束条件:判断靶子最左边位置的最大值是否比当前射箭位置大,如果满足就说明靶子全部击中。

我的代码:

import operator
​
def solution(k, p, target):
    # Please write your code here
​
    #对靶子的左边位置进行排序,得到左边位置最大的一个值
    target.sort(key=operator.itemgetter(0))
    last_left_position=target[k-1][0]
​
    #对靶子的右边位置进行从小到大排序
    target.sort(key=operator.itemgetter(1))
    
    #初始化
    arrows=0
    last_position=target[0][1]
    i=0
    flag=True
​
    while flag:
        for j in range(i,k):
            #判断靶子的左边位置是否比当前位置小,如果小就说明已经击中并略过
            if last_position<target[j][0]:
                break
        arrows+=1 #箭的数量加一
​
        #判断左边位置最大的靶子是否击中,若击中则说明全部靶子已经击中
        if last_position>=last_left_position:
            flag=False
        
        #更新下一个射箭的位置
        last_position=target[j][1]
        i=j
    print(arrows)
    return arrows%p

豆包代码:

def solution(k, p, target):
    # 对靶子的右边位置进行从小到大的排序
    target.sort(key=lambda x: x[1])
    
    arrows = 0
    last_position = -1
    
    for i in range(k):
        if target[i][0] > last_position:
            arrows += 1
            last_position = target[i][1]
    
    return arrows % p

在本题中,可以发现我的代码存在许多不足之处:

  • 双重排序增加了不必要的计算复杂度
  • 对靶子位置排序的代码不熟悉,代码复杂
  • 代码逻辑较为复杂,容易出错。(没有更好的能力让代码很好的体现出我的想法)

本题的思路是根据自己的想法想出来的,然后进行编码run成功之后才使用的豆包,发现豆包的思路比我的思路更为清晰,而且代码更为简洁。

本题的思路是根据我自己的想法构思出来的,经过编码并成功运行后,我使用了豆包查看了它的思路方法。通过对比,我发现豆包提供的思路比我最初的思路更为清晰,而且代码实现也更加简洁。这让我意识到,在解决问题时,借助外部工具和参考他人的思路可以有效提升解题效率和代码质量。

构造特定数组的逆序拼接

问题描述

小U得到了一个数字n,他的任务是构造一个特定数组。这个数组的构造规则是:对于每个i从1到n,将数字n到i逆序拼接,直到i等于n为止。最终,输出这个拼接后的数组。

例如,当n等于3时,拼接后的数组是 [3, 2, 1, 3, 2, 3]

解题思路

  1. 初始化结果列表:创建一个空列表 li 来存储最终的结果。

  2. 双重循环:

    • 外层循环遍历 i1n
    • 内层循环从 n 逆序遍历到 i,并将每个数字添加到结果列表 li 中。
  3. 返回结果列表:完成双重循环后,返回结果列表 li

代码

def solution(n: int) -> list:
    # write code here
    li=[]
    for i in range(n+1):
        for j in range(n,i,-1):
            li.append(j)
    return li