diff --git a/某大厂算法题库/比赛/比赛.py b/某大厂算法题库/比赛/比赛.py new file mode 100644 index 0000000..8549cfd --- /dev/null +++ b/某大厂算法题库/比赛/比赛.py @@ -0,0 +1,42 @@ +from functools import cmp_to_key + +# 输入评委人数和参赛选手人数 +m, n = map(int, input("请输入评委人数和参赛人数(以英文逗号隔开,如4,5): ").split(',')) +scores = [list(map(int, input("请输入评委打分(以英文逗号隔开): ").split(','))) for _ in range(m)] + + +def cmp(a, b): + if a["sum"] != b["sum"]: + return b["sum"] - a["sum"] + + for i in range(m): + if a["score"][i] == b["score"][i]: + continue + return b["score"][i] - a["score"][i] + return 0 + + +def getresult(): + if m < 3 or m > 10 or n < 3 or n > 100: + return "-1" + + players = [] + + for j in range(n): + player = [] + for i in range(m): + if scores[i][j] < 1 or scores[i][j] > 10: + return "-1" + player.append(scores[i][j]) + player.sort(reverse=True) + players.append({ + "idx": j, + "sum": sum(player), + "score": player + }) + sorted_players = sorted(players, key=cmp_to_key(cmp)) + + return ",".join(list(map(lambda x: str(x["idx"] + 1), sorted_players[:3]))) + + +print(getresult()) diff --git a/某大厂算法题库/比赛/相关延伸.py b/某大厂算法题库/比赛/相关延伸.py new file mode 100644 index 0000000..6d4b893 --- /dev/null +++ b/某大厂算法题库/比赛/相关延伸.py @@ -0,0 +1,103 @@ +# map的使用方法 +""" +map()函数的核心作用是:将一个函数应用到一个或多个可迭代对象的每个元素上,返回一个迭代器,可理解为批量处理元素的工具 +基本语法: + map(function, iterable, ...) + function: 要执行的函数(可以是普通函数、匿名函数lambda、内置函数) + iterable: 一个或多个可迭代对象(列表、元组、字符串、集合等) + 返回值: map对象(迭代器),需通过list()/tuple()等转为具体序列才能直观查看结果 +""" +# 示例 +# 批量转化 +nums1 = ['11', '14', '13', '22'] +result1 = map(int, nums1) +print(list(result1)) + +# 批量计算 +nums2 = [2, 3, 4, 5, 6] +result2 = map(lambda x: x ** 2, nums2) +print(list(result2)) + +# 多个可迭代对象 +lst1 = [1, 2, 3] +lst2 = [10, 20, 30] +result3 = map(lambda x, y: x + y, lst1, lst2) +print(list(result3)) + +# 可迭代对象不一致时,以最短的可迭代对象为准,超出部分直接忽略 +lst3 = [1, 2, 3] +lst4 = [10, 20, 30, 40, 50] +result4 = map(lambda x, y: x + y, lst3, lst4) +print(list(result4)) + +# cmp_to_key的使用方法 +""" +functools.cmp_to_key()是处理自定义排序规则的关键工具,核心作用是将传统的比较函数转换为排序所需的key函数,让我们能自定义更灵活的排序逻辑。 +基本语法: + from functools import cmp_to_key + + def compare(a, b): + # 返回规则 + # -1: a排在b前面 + # 1: a排在b后面 + # 0: a和b位置不变 + if 条件1: + return -1 + elif 条件2: + return 1 + else: + return 0 + + sorted_result = sorted(iterable, key=cmp_to_key(compare)) +""" + +# 示例1 +# 对数字列表按绝对值从大到小排序 +from functools import cmp_to_key + + +def compare(a, b): + abs_a = abs(a) + abs_b = abs(b) + if abs_a > abs_b: + return -1 # a的绝对值大,a排前面 + elif abs_a < abs_b: + return 1 # a的绝对值小,a排后面 + else: + return 0 # 绝对值相等,位置不变 + + +nums = [3, -5, 1, -2, 4] +sorted_nums = sorted(nums, key=cmp_to_key(compare)) +print(sorted_nums) + +# 示例2 +# 多条件自定义排序,对学生列表先按分数降序,分数相同再按年龄升序 +students = [ + {"name": "张三", "score": 90, "age": 18}, + {"name": "李四", "score": 85, "age": 19}, + {"name": "王五", "score": 90, "age": 17}, + {"name": "赵六", "score": 88, "age": 20} +] + +from functools import cmp_to_key + + +def cmp(a, b): + # 先比较分数,降序 + if a["score"] > b["score"]: + return -1 + elif a["score"] < b["score"]: + return 1 + else: + # 分数相同,在比较年龄,升序 + if a["age"] < b["age"]: + return -1 + elif a["age"] > b["age"]: + return 1 + else: + return 0 + + +sorted_students = sorted(students, key=cmp_to_key(cmp)) +print(sorted_students) diff --git a/某大厂算法题库/比赛/说明.md b/某大厂算法题库/比赛/说明.md new file mode 100644 index 0000000..c2a18fc --- /dev/null +++ b/某大厂算法题库/比赛/说明.md @@ -0,0 +1,91 @@ +# 比赛 + +## 题目描述 + +- 一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。 +- 打分规则为每个评委对选手打分,最高分10分,最低分1分。 +- 请计算得分最多的3位选手的编号。 +- 如果得分相同,则得分高分值最多的选手排名靠前 +- (10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。 + +## 输入描述 + +- 第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)个选手。 +- 第2到M+1行是半角逗号分割的整数序列,表示评委为每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。 + +## 输出描述 + +- 选手前3名的编号。 +- 注:若输入为异常,输出-1,如M、N、打分不在范围内。 + +## 用例 + +| 输入 | 4,5
10,6,9,7,6
9,10,6,7,5
8,10,6,5,10
9,10,8,4,9 | +| --- | ---------------------------------------------------------------------------------------------------------------------------------- | +| 输出 | 2,1,5 | +| 说明 | 第一行代表有4个评委,5个选手参加比赛;
矩阵代表是4*5,每个数字是选手的编号,每一行代表一个评委对选手的打分排序;
2号选手得分36分排第1,1号选手36分排第2,5号选手30分(2号10分值有3个,1号10分值只有1个,所以2号排第一); | + +| 输入 | 2,5
7,3,5,4,2
8,5,4,4,3 | +| --- | ------------------------------- | +| 输出 | -1 | +| 说明 | 只有2个评委,要求最少为3个评委 | + +| 输入 | 4,2
8,5
5,6
10,4
8,9 | +| --- | ------------------------------------ | +| 输出 | -1 | +| 说明 | 只有2名选手参加,要求最少为3名 | + +| 输入 | 4,5
11,6,9,7,8
9,10,6,7,8
8,10,6,9,7
9,10,8,6,7 | +| --- | --------------------------------------------------------------- | +| 输出 | -1 | +| 说明 | 第一个评委给第一个选手打分11,无效分数 | + +## 题目解析 + +考察数组排序,主要难点在于下面逻辑的设计: + +    如果得分相同,则得分高分值最多的选手排名靠前 + +## 相关延伸 + +对新手来说,map、function.cmp_to_key的使用方法 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +