本博客含有两道题目:唐门绝技——暴雨梨花针最少发射次数;构造特定数组的逆序拼接
唐门绝技:暴雨梨花针最少发射次数
问题描述
在唐门,外门弟子唐三发现了一种强大的暗器技巧,名为暴雨梨花针,它能在一条直线上摧毁所有目标。唐三在一本古籍中学习到了这门技巧,为了练习,他设置了若干个靶子在二维平面上。每个靶子是一条垂直于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]。
解题思路
-
初始化结果列表:创建一个空列表
li来存储最终的结果。 -
双重循环:
- 外层循环遍历
i从1到n。 - 内层循环从
n逆序遍历到i,并将每个数字添加到结果列表li中。
- 外层循环遍历
-
返回结果列表:完成双重循环后,返回结果列表
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