美文网首页
Leetcode1204. 最后一个能进入电梯的人(中等)

Leetcode1204. 最后一个能进入电梯的人(中等)

作者: kaka22 | 来源:发表于2020-07-19 15:01 被阅读0次

题目
表: Queue

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| person_id   | int     |
| person_name | varchar |
| weight      | int     |
| turn        | int     |
+-------------+---------+

person_id 是这个表的主键。
该表展示了所有等待电梯的人的信息。
表中 person_id 和 turn 列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。

电梯最大载重量为 1000。

写一条 SQL 查询语句查找最后一个能进入电梯且不超过重量限制的 person_name 。题目确保队列中第一位的人可以进入电梯 。

查询结果如下所示 :

Queue 表

+-----------+-------------------+--------+------+
| person_id | person_name       | weight | turn |
+-----------+-------------------+--------+------+
| 5         | George Washington | 250    | 1    |
| 3         | John Adams        | 350    | 2    |
| 6         | Thomas Jefferson  | 400    | 3    |
| 2         | Will Johnliams    | 200    | 4    |
| 4         | Thomas Jefferson  | 175    | 5    |
| 1         | James Elephant    | 500    | 6    |
+-----------+-------------------+--------+------+

Result 表

+-------------------+
| person_name       |
+-------------------+
| Thomas Jefferson  |
+-------------------+

为了简化,Queue 表按 trun 列由小到大排序。
上例中 George Washington(id 5), John Adams(id 3) 和 Thomas Jefferson(id 6) 将可以进入电梯,因为他们的体重和为 250 + 350 + 400 = 1000。
Thomas Jefferson(id 6) 是最后一个体重合适并进入电梯的人。

产生数据

DROP TABLE Queue;

CREATE TABLE Queue(person_id INT,
person_name VARCHAR(20),
weight INT,
turn INT);

INSERT INTO Queue VALUE(5, 'George Washington', 250, 1),
(3, 'John Adams', 350, 2),
(6, 'Thomas Jefferson', 400, 3),
(2, 'Will Johnliams', 200, 4),
(4, 'Thomas Jefferson', 175, 5),
(1, 'James Elephant', 500, 6);

解答
按turn计算累计体重即可 把累计小于1000的选出 排序选出最大累计对应的人名即可

SELECT Q.`person_name`, @cum_weight:=@cum_weight + Q.weight AS cum_weight
FROM Queue AS Q, (SELECT @cum_weight:=0) AS init
ORDER BY Q.`turn` ASC;
SELECT tmp.`person_name` AS `person_name`
FROM (SELECT Q.`person_name`, @cum_weight:=@cum_weight + Q.weight AS cum_weight
FROM Queue AS Q, (SELECT @cum_weight:=0) AS init
ORDER BY Q.`turn` ASC) AS tmp
WHERE tmp.cum_weight <=1000
ORDER BY tmp.cum_weight DESC
LIMIT 0,1;  #偏移0  选取1

别的解答
老实讲 很不擅长写这种代码
先选出累计体重小于1000的用户

SELECT Q.person_name
FROM Queue AS Q
WHERE (SELECT SUM(weight) FROM Queue AS Q1 WHERE Q1.turn <= Q.turn) <= 1000

然后按照turn降序选出第一个即可

SELECT Q.person_name
FROM Queue AS Q
WHERE (SELECT SUM(weight) FROM Queue AS Q1 WHERE Q1.turn <= Q.turn) <= 1000
ORDER BY Q.`turn` DESC
LIMIT 0,1;

与我的方法类似用自连接即可

select a.person_name
from queue a, queue b
where a.turn >= b.turn
group by a.person_id
having sum(b.weight) <= 1000
order by a.turn desc
limit 1

相关文章

  • Leetcode1204. 最后一个能进入电梯的人(中等)

    题目表: Queue person_id 是这个表的主键。该表展示了所有等待电梯的人的信息。表中 person_i...

  • Leetcode 1204. 最后一个能进入电梯的人

    https://leetcode-cn.com/problems/last-person-to-fit-in-th...

  • 很多事,真的跟你没关系吗?

    今天,遇到了这样一种情况。分享给大家。 每家公司都有一个层层停的电梯,每个进入电梯的都是疲惫的人,不是头靠电梯呈发...

  • 为善意之举点赞

    感动,有时只不过是一瞬间的事。前几天看到一个视频,几个人乘坐电梯,当最后一个人拎着东西进入电梯时,屏幕显示...

  • 电梯惊魂的背后

    下午上班,我匆匆忙忙赶到单位,打完卡后,发现电梯刚好下来,几个行政区的人员进入电梯,我也跟随上了电梯。 电梯从一楼...

  • 现在有多少人的工资能达到5000块?

    工资能达到5000块,基本也就是一个小中等的水平。三四线城市能算中等收入水平,而在一二线城市也就中等偏下水平。 如...

  • 彻底修复原生家庭的痛

    话疗班今天进入第四天,每天如坐电梯一般,层层提升,我就像一个第一次坐电梯的人,并且坐的是观景电梯,充满了惊喜,坐的...

  • 从电梯内站位引起的推测

    (适用于进入空电梯的主动站位而非电梯快满员时的被迫站位) 选择站电梯按钮旁的人,有责任心,主动承担按按钮的责任,愿...

  • 管理来自生活:(1)电梯理论

    电梯,大家耳熟能详,试问生活在城市中的人们,谁没有做过电梯呢?又有多少人每天都是离不开电梯的呢?电梯者,载人去也。...

  • 函数去抖debounce

    1.什么是函数去抖 乘坐电梯时,一个人按下电梯进入电梯后,此时如果另一个人也按下了该层电梯,电梯不会运动,这种状态...

网友评论

      本文标题:Leetcode1204. 最后一个能进入电梯的人(中等)

      本文链接:https://www.haomeiwen.com/subject/jkelkktx.html