学习基于LangChain实战课(掘金小册) | 青训营X豆包MarsCode AI 刷题 - AI方向
主题:刷题记录
类型:实践记录/学习体验/学习方法
问题描述
小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。
测试样例
样例1:
输入:<font style="color:#ED740C;">n = 4 ,s = ["a", "b", "c", "d"] ,x = [1, 2, 2, 1]</font>
\ 输出:<font style="color:#ED740C;">['b', 'c', 'a', 'd']</font>
样例2:
输入:<font style="color:#ED740C;">n = 3 ,s = ["x", "y", "z"] ,x = [100, 200, 200]</font>
\ 输出:<font style="color:#ED740C;">['y', 'z', 'x']</font>
样例3:
输入:<font style="color:#ED740C;">n = 5 ,s = ["m", "n", "o", "p", "q"] ,x = [50, 50, 30, 30, 20]</font>
\ 输出:<font style="color:#ED740C;">['m', 'n', 'o', 'p', 'q']</font>
Python代码
from collections import defaultdict
def solution(n: int, s: list, x: list) -> list:
# 使用defaultdict来分组
groups = defaultdict(int)
# 对同一个人的金额进行加和
for name, amount in zip(s, x):
groups[name] += amount
# 将分组后的数据转换为列表,并添加索引信息
people = list(enumerate(groups.items()))
# 自定义排序键
sorted_people = sorted(people, key=lambda p: (-p[1][1], p[0]))
# 提取排序后的名字
result = [p[1][0] for p in sorted_people]
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'])
print(solution(12,["aa","aaaaaaa","aaaa","aaaa","aaaa","aaaaaaaaaa","aaaaaaaaa","aaaa","aaaaaaaaaa","aaaaaaaaa","aaaaa","aaaa"],[17,14,11,2,8,16,14,17,10,6,5,12])== ["aaaa","aaaaaaaaaa","aaaaaaaaa","aa","aaaaaaa","aaaaa"])
代码解释
导入模块:
- python from collections import defaultdict
这里导入了 **defaultdict**
,用于创建一个默认值为 **int**
的字典,方便我们对同一个人的金额进行加和。
定义** **solution**
**函数:
- python def solution(n: int, s: list, x: list) -> list:
这个函数接收三个参数:**n**
表示参与者的数量,**s**
是参与者的名字列表,**x**
是每个参与者抢到的金额列表。
分组并加和:
- python groups = defaultdict(int)for name, amount in zip(s, x): groups[name] += amount
这里使用 **defaultdict(int)**
来创建一个字典 **groups**
,键是参与者的名字,值是金额的加和。通过 **zip(s, x)**
遍历每个参与者的名字和金额,并将相同名字的金额加和。
添加索引信息并排序:
- python people = list(enumerate(groups.items()))sorted_people = sorted(people, key=lambda p: (-p[1][1], p[0]))
这里将分组后的数据转换为列表 **people**
,并添加索引信息。然后使用 **sorted**
函数对 **people**
进行排序,排序的键是 **(-p[1][1], p[0])**
,即先按金额从大到小排序,如果金额相同则按索引从小到大排序。
提取排序后的名字:
- python result = [p[1][0] for p in sorted_people]
这里提取排序后的名字,并将其作为结果返回。
总结
- 分组:使用
**defaultdict(int)**
对同一个人的金额进行加和。 - 排序:根据加和后的金额进行排序,如果金额相同则按照抢红包的顺序进行排序。
- 提取结果:提取排序后的名字作为结果。
这样,你就可以对同一个人的金额进行加和,然后再进行排序了。
使用体验
在线便捷,速览多个题目,可以快速查看要刷的简单题、中等、难题。辅助的ai可以帮助理解题目,给出的解题思路也快速的帮助我了解题目,排查出了问题。