简单题红包运气排行榜 | 豆包MarsCode AI 刷题

16 阅读3分钟

学习基于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"])

代码解释

导入模块

  1. python from collections import defaultdict

这里导入了 **defaultdict**,用于创建一个默认值为 **int** 的字典,方便我们对同一个人的金额进行加和。

定义** **solution** **函数

  1. python def solution(n: int, s: list, x: list) -> list:

这个函数接收三个参数:**n** 表示参与者的数量,**s** 是参与者的名字列表,**x** 是每个参与者抢到的金额列表。

分组并加和

  1. python groups = defaultdict(int)for name, amount in zip(s, x): groups[name] += amount

这里使用 **defaultdict(int)** 来创建一个字典 **groups**,键是参与者的名字,值是金额的加和。通过 **zip(s, x)** 遍历每个参与者的名字和金额,并将相同名字的金额加和。

添加索引信息并排序

  1. 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])**,即先按金额从大到小排序,如果金额相同则按索引从小到大排序。

提取排序后的名字

  1. python result = [p[1][0] for p in sorted_people]

这里提取排序后的名字,并将其作为结果返回。

总结

  • 分组:使用 **defaultdict(int)** 对同一个人的金额进行加和。
  • 排序:根据加和后的金额进行排序,如果金额相同则按照抢红包的顺序进行排序。
  • 提取结果:提取排序后的名字作为结果。

这样,你就可以对同一个人的金额进行加和,然后再进行排序了。

使用体验

在线便捷,速览多个题目,可以快速查看要刷的简单题、中等、难题。辅助的ai可以帮助理解题目,给出的解题思路也快速的帮助我了解题目,排查出了问题。