今天又做了两道豆包MarsCode AI刷题题库中的题:小R的随机播放顺序、游戏英雄升级潜力评估,分享一下我的解答过程。
小R的随机播放顺序
问题描述
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4],真实的播放顺序是 [5, 2, 4, 1, 3]。
保证歌曲中的id两两不同。
测试样例
样例1:
输入:
n = 5 ,a = [5, 3, 2, 1, 4]
输出:[5, 2, 4, 1, 3]
样例2:
输入:
n = 4 ,a = [4, 1, 3, 2]
输出:[4, 3, 1, 2]
样例3:
输入:
n = 6 ,a = [1, 2, 3, 4, 5, 6]
输出:[1, 3, 5, 2, 6, 4]
解题思路
创建一个空列表存储真正播放顺序,使用while循环,播放列表还有歌的时候,进行操作:弹出歌单第一个元素并加入到真正顺序列表中;弹出歌单第一个元素并插入到歌单最后。特殊情况是播放列表只剩一首歌时,直接弹出并加入真正播放顺序,结束循环。
代码实现
def solution(n: int, a: list) -> list:
order = []
while len(a) != 0:
order.append(a.pop(0))
if len(a) == 1:
order.append(a.pop(0))
break
a.append(a.pop(0))
return order
游戏英雄升级潜力评估
问题描述
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。
测试样例
样例1:
输入:
n = 5 ,u = [1, 2, 3, 1, 2]
输出:3
样例2:
输入:
n = 4 ,u = [100000, 100000, 100000, 100000]
输出:0
样例3:
输入:
n = 6 ,u = [1, 1, 1, 2, 2, 2]
输出:3
解题思路
刚开始看问题描述里有个贼大的数字还吓了一跳,结果发现逻辑很简单,只要能跟其他英雄产生等级差的英雄就能够达到2000000000000000级。首先对数组a进行排序,方便挑选初始等级最高的英雄。使用一个while循环,当数组a长度大于1时,进行操作:比较最大等级和最小等级。若不相等,最大等级可以通过每天跟最小等级的历练达到目标等级,于是count加一,并将该英雄弹出,进行下一次循环(感觉等级最低的那个英雄好惨,可以当所有人的沙包……)。若相等,说所有英雄等级都一样,大家都没法升级,结束循环。
代码实现
def solution(n: int, u: list) -> int:
u.sort()
if u[0] == u[-1]:
return 0
count = 0
while len(u) > 1:
if u[0] != u[-1]:
count += 1
u.pop(-1)
else:
break
return count