LeetCode(数据库)- 换座位

题目链接:点击打开链接

 

题目大意:略。

 

解题思路:

  • 解决方案(1):自定义变量,id 保持不变,交换 student,然后最后一个需要特判下是否超过 MAX(id) 即可
  • 解决方案(2):student 保持不变,交换 id,然后最后按照 id 排序下即可
  • 解决方案(3):骚操作,位运算(异或)+ COALESCE 函数(返回其参数中第一个非空表达式)巧妙地解决了特判最后一个问题,主要是理解 ((s1.id + 1) ^ 1) - 1 = s2.id,拿纸笔画下找下规律就知道了,如下所示
    SELECT
        *
    FROM
        seat s1
            LEFT JOIN
        seat s2 ON (s1.id+1)^1-1 = s2.id
    ORDER BY s1.id;
    
    | id | student | id | student |
    |----|---------|----|---------|
    | 1  | Abbot   | 2  | Doris   |
    | 2  | Doris   | 1  | Abbot   |
    | 3  | Emerson | 4  | Green   |
    | 4  | Green   | 3  | Emerson |
    | 5  | Jeames  |    |         |

 

AC 代码

-- 解决方案(1)
SELECT rs.id, rs.stu student
FROM (SELECT id, @tid:=IF(MOD(id, 2) = 1, IF(id + 1 > init.MAXID, id, id + 1), id - 1),  (SELECT student FROM seat WHERE id = @tid) stu
FROM seat, (SELECT @tid:=null, MAX(id) MAXID FROM seat) init) rs

-- 解决方案(2)
SELECT
    (CASE
        WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
        WHEN MOD(id, 2) != 0 AND counts = id THEN id
        ELSE id - 1
    END) AS id,
    student
FROM
    seat,
    (SELECT
        COUNT(*) AS counts
    FROM
        seat) AS seat_counts
ORDER BY id ASC;

-- 解决方案(3)
SELECT
    s1.id, COALESCE(s2.student, s1.student) AS student
FROM
    seat s1
        LEFT JOIN
    seat s2 ON ((s1.id + 1) ^ 1) - 1 = s2.id
ORDER BY s1.id;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆氪和他的那些代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值