Leetcode 626-换座位题目解析

1.题目

编写解决方案来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。按 id 升序 返回结果表。

fb02fcb9adc348c088471d91c16f2d8b.png

 

2.数据准备

Create table If Not Exists Seat (id int, student varchar(255));
Truncate table Seat;
insert into Seat (id, student) values ('1', 'Abbot');
insert into Seat (id, student) values ('2', 'Doris');
insert into Seat (id, student) values ('3', 'Emerson');
insert into Seat (id, student) values ('4', 'Green');
insert into Seat (id, student) values ('5', 'Jeames');

3.方法1

332 ms击败 87.59%

1.change1 子查询

  • 选择 Seat 表中的 id 字段。
  • 使用 CASE 语句根据 id 的奇偶性生成新的 new_id
    • 如果 id 是奇数(MOD(id, 2) <> 0),则 new_idid + 1(使其变为偶数)。
    • 如果 id 是偶数,则 new_idid - 1(使其变为奇数)。

2.last 子查询

  • Seat 表中选择最后一条学生记录(根据 id 降序排序)。
  • 这意味着查询将返回具有最大 ID 的学生。

3.主查询

  • change1 子查询中选择 t1.idstudent 字段。
  • 使用 LEFT JOINchange1 的结果与 Seat 表连接,条件是 t1.new_id = t2.id
  • CASE 语句用于决定 student 字段的值:
    • 如果 t2.student 不为空(即找到了对应的学生),则返回该学生的姓名。
    • 如果 t2.student 为空(即没有找到对应的学生),则返回 last 子查询的结果(最后一位学生的姓名)。

 

WITH change1 as(
    SELECT id,
    CASE WHEN MOD(id,2)<>0 then id+1    
    ELSE id-1 END AS new_id
    FROM Seat
),
last as(
    SELECT student 
    FROM Seat 
    ORDER BY id DESC 
    LIMIT 1
)
SELECT 
    t1.id
    ,CASE WHEN t2.student IS NOT NULL THEN student
	    WHEN student IS  NULL THEN (SELECT * from last) END AS student
FROM change1 t1
LEFT JOIN Seat t2 ON t1.new_id = t2.id

4.方法2

314 ms击败 99.10%

1.last 子查询

  • Seat 表中选择 ID 字段,按 ID 降序排列,返回最后一条记录的 ID(即最大 ID)。
  • 这一步骤用于后续条件判断。

2.主查询

  • 使用 CASE 语句处理每个学生的 ID:
    • 偶数 ID:如果 ID 是偶数,返回 id - 1(将偶数转换为其前一个奇数)。
    • 最大 ID:如果 ID 是最大 ID,保持不变,返回该 ID。
    • 奇数 ID:否则(即 ID 是奇数),返回 id + 1(将奇数转换为其后一个偶数)。
  • 同时选择 student 字段。
  • 按处理后的 ID 进行排序。
WITH last as(
    SELECT id FROM Seat ORDER BY id DESC LIMIT 1
)
SELECT CASE WHEN MOD(id,2) = 0 THEN id-1
    WHEN id =(SELECT * from last) then id
    ELSE id+1 end as id,student
from Seat 
order by id

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值