- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Matches
+-------------+------+ | Column Name | Type | +-------------+------+ | player_id | int | | match_day | date | | result | enum | +-------------+------+ (player_id, match_day) 是该表的主键(具有唯一值的列的组合)。 每一行包括了:参赛选手 id、 比赛时间、 比赛结果。 比赛结果(result)的枚举类型为 ('Win', 'Draw', 'Lose')。选手的 连胜数 是指连续获胜的次数,且没有被平局或输球中断。
编写解决方案来计算每个参赛选手最多的连胜数。
结果可以以 任何顺序 返回。
结果格式如下例所示:
示例 1:
输入: Matches 表: +-----------+------------+--------+ | player_id | match_day | result | +-----------+------------+--------+ | 1 | 2022-01-17 | Win | | 1 | 2022-01-18 | Win | | 1 | 2022-01-25 | Win | | 1 | 2022-01-31 | Draw | | 1 | 2022-02-08 | Win | | 2 | 2022-02-06 | Lose | | 2 | 2022-02-08 | Lose | | 3 | 2022-03-30 | Win | +-----------+------------+--------+ 输出: +-----------+----------------+ | player_id | longest_streak | +-----------+----------------+ | 1 | 3 | | 2 | 0 | | 3 | 1 | +-----------+----------------+ 解释: Player 1: 从 2022-01-17 到 2022-01-25, player 1连续赢了三场比赛。 2022-01-31, player 1 平局. 2022-02-08, player 1 赢了一场比赛。 最多连胜了三场比赛。 Player 2: 从 2022-02-06 到 2022-02-08, player 2 输了两场比赛。 最多连赢了0场比赛。 Player 3: 2022-03-30, player 3 赢了一场比赛。 最多连赢了一场比赛。
三,建表语句
import pandas as pd
data = [[1, '2022-01-17', 'Win'], [1, '2022-01-18', 'Win'], [1, '2022-01-25', 'Win'], [1, '2022-01-31', 'Draw'], [1, '2022-02-08', 'Win'], [2, '2022-02-06', 'Lose'], [2, '2022-02-08', 'Lose'], [3, '2022-03-30', 'Win']]
matches = pd.DataFrame(data, columns=['player_id', 'match_day', 'result']).astype({'player_id':'Int64', 'match_day':'datetime64[ns]', 'result':'object'})
matches
四,分析
思路
表格分析大法 用啥解答不重要 重要的还是思路和逻辑 表格中把思路和逻辑盘顺, sql或者pandas自然顺手敲来
mysql和pandas完整代码 在最后 不过代码其实不重要,重要的是学会其中的逻辑 和总结规律(方法论);
下次遇到这种题就可以很快解答了
第一步 :开2个排序 分别以player_id分组排序 和游戏id,比赛成绩排序 生成2个序列
第二步:求差值 如果差值相等 则为连续
第三步:以游玩id和差值 分组 聚合胜利的次数 如果是胜利的 if给他1 其余的给0 这样sum就可以拿到连胜次数
第四步:分组求top1呗 每个参赛选手最多的连胜数。
第五步:最后按照题目要求排序
其实汇合起来就是2个步骤 详情见 下方图解
- 第一步 分别分组排序取差值
- 第二步 分组求top1
Pandas实现:
第一步排序:
第二步:分别开两个新列
第三步:取差值
第四步,转换一下成绩列 方便我们一会儿sum
第五步,取指定的列
第六步 以id,成绩,差值分组 统计次数
第七步,取最大值
第八步 改名
五,SQL解答
import pandas as pd
def longest_winning_streak(matches: pd.DataFrame) -> pd.DataFrame:
# 对原表进行排序
matches = matches.sort_values(['player_id','match_day'])
# 开两个新的排序 第一个排序
matches['rn'] =matches.groupby(['player_id'])['match_day'].rank(method='first',ascending=True)
# 开两个新的排序 第二个排序
matches['rn1'] =matches.groupby(['player_id','result'])['match_day'].rank(method='first',ascending=True)
#取差值
matches['diff'] = matches['rn'] - matches['rn1']
# 把result列转换一下 胜利的为1 其他的为0 这样方便我们sum
matches['res'] = matches['result'].apply(lambda x:1 if x=='Win' else 0)
df = matches[['player_id','result','diff','res']]
df1 = df.groupby(['player_id','result','diff']).sum().reset_index()
# df1
df2 = df1.groupby(['player_id'])['res'].max().reset_index()
df3 = df2.rename(columns={'res':'longest_streak'})
return df3
longest_winning_streak(matches)
六,验证
七,知识点总结
- Pandas排序的运用 API:sort_values
- Pandas中开新列的运用 相当于sql中的 row_number用法 API groupby....rank
- Pandas中自定义函数的运用 apply
- python中的三目运算符运用
- python中的匿名函数的运用 lanbda
- Pandas中求和的运用
- Pandas中重新生成索引的运用 API reset_index()
- Pandas中多列分组 求最大值的运用 max
- Pandas中改名的运用
- 经典的连续问题 先求差值 在根据差值分组 根据需求做各种下一步运算
标签:面试题,01,matches,Win,力扣,player,数分,2022,id From: https://blog.csdn.net/qq_55006020/article/details/142595881
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用