首页 > 其他分享 >力扣-2175、世界排名的变化

力扣-2175、世界排名的变化

时间:2024-11-18 20:49:57浏览次数:3  
标签:分数 世界排名 name 2175 力扣 points team 排名 id

一、数据来源

2175、世界排名的变换

表:TeamPoints

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| team_id     | int     |
| name        | varchar |
| points      | int     |
+-------------+---------+
team_id 包含唯一值。
这张表的每一行均包含了一支国家队的 ID,它所代表的国家,以及它在全球排名中的得分。没有两支队伍代表同一个国家。

表:PointsChange

+---------------+------+
| Column Name   | Type |
+---------------+------+
| team_id       | int  |
| points_change | int  |
+---------------+------+
team_id 包含唯一值。
这张表的每一行均包含了一支国家队的 ID 以及它在世界排名中的得分的变化。
分数的变化分以下情况:
- 0:代表分数没有改变
- 正数:代表分数增加
- 负数:代表分数降低
TeamPoints 表中出现的每一个 team_id 均会在这张表中出现。

国家队的全球排名是按 降序排列 所有队伍的得分后所得出的排名。如果两支队伍得分相同,我们将按其名称的 字典顺序 排列以打破平衡。

每支国家队的分数应根据其相应的 points_change 进行更新。

编写解决方案来计算在分数更新后,每个队伍的全球排名的变化。

 任意顺序 返回结果。

查询结果的格式如下例所示:

示例 1:

输入:
TeamPoints 表:
+---------+-------------+--------+
| team_id | name        | points |
+---------+-------------+--------+
| 3       | Algeria     | 1431   |
| 1       | Senegal     | 2132   |
| 2       | New Zealand | 1402   |
| 4       | Croatia     | 1817   |
+---------+-------------+--------+
PointsChange 表:
+---------+---------------+
| team_id | points_change |
+---------+---------------+
| 3       | 399           |
| 2       | 0             |
| 4       | 13            |
| 1       | -22           |
+---------+---------------+
输出:
+---------+-------------+-----------+
| team_id | name        | rank_diff |
+---------+-------------+-----------+
| 1       | Senegal     | 0         |
| 4       | Croatia     | -1        |
| 3       | Algeria     | 1         |
| 2       | New Zealand | 0         |
+---------+-------------+-----------+
解释:
世界排名如下所示:
+---------+-------------+--------+------+
| team_id | name        | points | rank |
+---------+-------------+--------+------+
| 1       | Senegal     | 2132   | 1    |
| 4       | Croatia     | 1817   | 2    |
| 3       | Algeria     | 1431   | 3    |
| 2       | New Zealand | 1402   | 4    |
+---------+-------------+--------+------+
在更新分数后,世界排名变为下表:
+---------+-------------+--------+------+
| team_id | name        | points | rank |
+---------+-------------+--------+------+
| 1       | Senegal     | 2110   | 1    |
| 3       | Algeria     | 1830   | 2    |
| 4       | Croatia     | 1830   | 3    |
| 2       | New Zealand | 1402   | 4    |
+---------+-------------+--------+------+
由于在更新分数后,Algeria 和 Croatia 的得分相同,因此根据字典顺序对它们进行排序。
Senegal 丢失了22分但他们的排名没有改变。
Croatia 获得了13分但是他们的排名下降了1名。
Algeria 获得399分,排名上升了1名。
New Zealand 没有获得或丢失分数,他们的排名也没有发生变化。

二、分析

由题可知,我们需要算出更新分数前的每个球队id的排名和更新分数后的每个球队的世界排名。

因此我们可以使用WITH临时表先对更新分数之前的球队进行排名,作为表1;然后将TeamPoints和PointsChange以球队的id为条件将两表连接起来,算出更新过后的分数,并以此排名,作为表2;然后将表1和表2以球队id连接起来,用更新分数之前的排名减去更新后的排名,算出结果。

但是需要注意,表1和表2的排名是有符号型的数字,直接去减,会直接报错,所以需要将两个排名转为有符号型的数值然后再减。

三、代码

with tem as (
select *,row_number() over (order by points desc,name ) rk
from teampoints)
,t2 as (
select  t1.team_id,t1.name,(points + points_change)after,row_number () over (order by (points + points_change)desc,name) rk2
from teampoints t1
join pointschange p1 on t1.team_id = p1.team_id)
select tem.team_id,tem.name,cast(rk as signed) - cast(rk2 as signed) rank_diff -- 强转为有符号性数值
from tem
join t2 on tem.team_id = t2.team_id;

四、总结

需要注意的是:使用排名函数得出来额排名的值,是无符号型的,如果用排名进行运算,可能会直接报错,所以需要使用CAST函数将此强转为有符号性数值。

标签:分数,世界排名,name,2175,力扣,points,team,排名,id
From: https://blog.csdn.net/dhdbanwan/article/details/143817019

相关文章

  • leetcode 扫描线专题 06-leetcode.836 rectangle-overlap 力扣.836 矩形重叠
    题目矩形以列表[x1,y1,x2,y2]的形式表示,其中(x1,y1)为左下角的坐标,(x2,y2)是右上角的坐标。矩形的上下边平行于x轴,左右边平行于y轴。如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形rec1和rec2。如果它......
  • leetcode 扫描线专题 06-leetcode.391 perfect-rectangle 力扣.391 完美矩形
    题目给你一个数组rectangles,其中rectangles[i]=[xi,yi,ai,bi]表示一个坐标轴平行的矩形。这个矩形的左下顶点是(xi,yi),右上顶点是(ai,bi)。如果所有矩形一起精确覆盖了某个矩形区域,则返回true;否则,返回false。示例1:输入:rectangles=[[1,1,3,3],[3,1,4,2],......
  • 力扣题目解析--括号生成
    题目数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]提示:1<=n<=8代码展示 classSolution{publi......
  • 102. 二叉树的层序遍历【 力扣(LeetCode) 】
    文章目录零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码零、原题链接102.二叉树的层序遍历一、题目描述给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。二、测试用例示例1:输入:root=[3,9,20,null,nul......
  • 力扣825.适龄的朋友,全网最详细解释
    好友请求的总数(LeetCode825)题目描述某社交平台规定,用户A可以向用户B发送好友请求需满足以下条件:用户A的年龄不小于用户B的年龄。用户B的年龄大于0.5*用户A的年龄+7。用户B的年龄小于等于用户A的年龄。此外,一个用户不能向自己发送好友请求。输入:......
  • 力扣.223 矩形面积 rectangle-area
    题目给你二维平面上两个由直线构成且边与坐标轴平行/垂直的矩形,请你计算并返回两个矩形覆盖的总面积。每个矩形由其左下顶点和右上顶点坐标表示:第一个矩形由其左下顶点(ax1,ay1)和右上顶点(ax2,ay2)定义。第二个矩形由其左下顶点(bx1,by1)和右上顶点(bx2,b......
  • 力扣 LeetCode 94. 二叉树的中序遍历(Day6:二叉树)
    解题思路:方法一:递归(左中右)classSolution{List<Integer>res=newArrayList<>();publicList<Integer>inorderTraversal(TreeNoderoot){recur(root);returnres;}publicvoidrecur(TreeNoderoot){if(......
  • leetcode 扫描线专题 06-leetcode.252 meeting room 力扣.252 会议室
    扫描线专题leetcode扫描线专题06-扫描线算法(SweepLineAlgorithm)leetcode扫描线专题06-leetcode.218the-skyline-problem力扣.218天际线问题leetcode扫描线专题06-leetcode.252meetingroom力扣.252会议室leetcode扫描线专题06-leetcode.253meetingroomii......
  • 力扣-Mysql-3293-计算产品最终价格(中等)
    一、题目来源3293.计算产品最终价格-力扣(LeetCode)二、数据表结构表:Products+------------+---------+|ColumnName|Type|+------------+---------+|product_id|int||category|varchar||price|decimal|+------------+-------......
  • 力扣-Mysql-3308- 寻找表现最佳的司机(中等)
    一、题目来源3308.寻找表现最佳的司机-力扣(LeetCode)二、数据表结构表:Drivers+--------------+---------+|ColumnName|Type|+--------------+---------+|driver_id|int||name|varchar||age|int||experience......