题目内容
初次尝试
看到这题的样例,我一看直接上sort稳定排序就行
代码如下:
def solution(n: int, s: list, x: list) -> list:
# 创建一个包含元组的列表,每个元组包含名字、金额和原始顺序
participants = [(s[i], x[i], i) for i in range(n)]
# 使用sorted函数进行排序,先按金额降序,再按原始顺序升序
sorted_participants = sorted(participants, key=lambda p: (-p[1], p[2]))
# 提取排序后的名字列表
result = [p[0] for p in sorted_participants]
return result
if __name__ == '__main__':
print(solution(4, ["a", "b", "c", "d"], [1, 2, 2, 1]) == ['b', 'c', 'a', 'd'])
print(solution(3, ["x", "y", "z"], [100, 200, 200]) == ['y', 'z', 'x'])
print(solution(5, ["m", "n", "o", "p", "q"], [50, 50, 30, 30, 20]) == ['m', 'n', 'o', 'p', 'q'])
测试全过,结果一提交:
最坑人的来了,我是万万没想到红包还能重复抢,还可以累加金额,敢情还得记录一下用户名并统计它们所抢到红包总的金额。
再次尝试
class UserRedPacket:
def __init__(self, name, amount):
self.name = name
self.amount = amount
def solution(n, s, x):
# 创建用户红包列表
user_red_packets = []
# 创建一个字典记录用户名和对应的红包金额
user_amount_map = {}
# 遍历输入的用户名和红包金额
for i in range(n):
user_name = s[i] # 获取当前用户名
amount = x[i] # 获取当前红包金额
# 如果用户名已经存在,累加金额
if user_name in user_amount_map:
user_amount_map[user_name] += amount
else:
# 否则,添加新的用户名和金额
user_amount_map[user_name] = amount
user_red_packets.append(UserRedPacket(user_name, amount))
# 更新用户红包列表中的金额
for user in user_red_packets:
user.amount = user_amount_map[user.name]
# 根据红包金额进行稳定排序
user_red_packets.sort(key=lambda a: (-a.amount, s.index(a.name)))
# 提取排序后的用户名
result = [user.name for user in user_red_packets]
return result
这里我单独创了一个类(作为相应数据结构),用来标识用户(用户名+红包总金额) 排序还是循着第一次尝试的思路,先按金额逆序排列,金额相同再按原来次序排,直接利用python的lambda表达式作“谓词”即可实现。
运行结果
终于过了🤣