实用指南:力扣1204-最后一个能进入巴士的人

表: Queue

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| person_id   | int     |
| person_name | varchar |
| weight      | int     |
| turn        | int     |
+-------------+---------+
person_id 是这个表具有唯一值的列。
该表展示了所有候车乘客的信息。
表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。
turn 决定了候车乘客上巴士的顺序,其中 turn=1 表示第一个上巴士,turn=n 表示最后一个上巴士。
weight 表示候车乘客的体重,以千克为单位。

有一队乘客在等着上巴士。然而,巴士有1000千克 的重量限制,所以其中一部分乘客可能无法上巴士。

编写解决方案找出 最后一个 上巴士且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上巴士且不会超重。

返回结果格式如下所示。

示例 1:

输入:
Queue 表
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5         | Alice       | 250    | 1    |
| 4         | Bob         | 175    | 5    |
| 3         | Alex        | 350    | 2    |
| 6         | John Cena   | 400    | 3    |
| 1         | Winston     | 500    | 6    |
| 2         | Marie       | 200    | 4    |
+-----------+-------------+--------+------+
输出:
+-------------+
| person_name |
+-------------+
| John Cena   |
+-------------+
解释:
为了简化,Queue 表按 turn 列由小到大排序。
+------+----+-----------+--------+--------------+
| Turn | ID | Name      | Weight | Total Weight |
+------+----+-----------+--------+--------------+
| 1    | 5  | Alice     | 250    | 250          |
| 2    | 3  | Alex      | 350    | 600          |
| 3    | 6  | John Cena | 400    | 1000         | (最后一个上巴士)
| 4    | 2  | Marie     | 200    | 1200         | (无法上巴士)
| 5    | 4  | Bob       | 175    | ___          |
| 6    | 1  | Winston   | 500    | ___          |
+------+----+-----------+--------+--------------+

思路:

1、按队列的顺序对每个人的重量进行累加计算,得到从队列开始到当前人的累加总重量 total_sum,用于后续判断累计是否超过限制

2、在累加总重量计算完成的基础上筛选出累加总重量小于等于 1000 的记录,排除累加重量超过限制的人,只保留在允许范围内的候选人

3、对筛选后的记录按累加总重量从大到小进行排序,并使用 row_number() 给每条记录标记排名,以便找到累加重量最大的记录

4、最终选择排名为第一的记录,获取对应的 person_name,即在累加重量不超过 1000 的情况下累加重量最大的那个人

代码:

with t as(
    select
turn,
person_id,
person_name,
weight,
sum(weight) over(order by turn) total_sum
from Queue
)
,t1 as(
    select
turn,
person_id as id,
person_name ,
weight,
total_sum,
row_number() over(order by total_sum desc) rn
from t where total_sum <=1000
)
select person_name from t1 where rn = 1;

posted @ 2026-02-05 15:23  clnchanpin  阅读(10)  评论(0)    收藏  举报