题目链接:https://leetcode-cn.com/problems/exchange-seats/

题目

小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id

其中纵列的 id 是连续递增的

小美想改变相邻俩学生的座位。

你能不能帮她写一个 SQL query 来输出小美想要的结果呢?

示例:

+---------+---------+

| id | student |

+---------+---------+

| 1 | Abbot |

| 2 | Doris |

| 3 | Emerson |

| 4 | Green |

| 5 | Jeames |

+---------+---------+

假如数据输入的是上表,则输出结果如下:

+---------+---------+

| id | student |

+---------+---------+

| 1 | Doris |

| 2 | Abbot |

| 3 | Green |

| 4 | Emerson |

| 5 | Jeames |

+---------+---------+

注意:

如果学生人数是奇数,则不需要改变最后一个同学的座位。

解答

解法一

根据自己的逻辑尝试了一下,居然提交通过,哈哈!

---- MySQL ----
# Write your MySQL query statement below
select case when b.cnt % 2 = 0 then
case when a.id % 2 = 0 then id - 1
when a.id % 2 = 1 then id + 1 end
when b.cnt % 2 = 1 then
case when a.id < b.cnt then
case when a.id % 2 = 0 then id - 1
when a.id % 2 = 1 then id + 1 end
else id end
end as id,
student
from seat a,
(
select count(*) as cnt
from seat
) b
order by id; ---- 126ms

引入总行数计数 cnt ,作为另外一个表;

判断当前行数是偶数还是奇数,再判断当前 id 是奇数还是偶数,奇数+1,偶数 -1,依次类推;

当行数为奇数时,最后一行 id 不作任何操作。

简化一下。

---- MySQL ----
# Write your MySQL query statement below
select if(id % 2 = 0,
id - 1,
if(id = cnt,
id,
id + 1
)
) as id,
student
from
(
select count(*) as cnt from seat
) as a,
seat
order by id; ---- 133ms

另一种。

---- MySQL ----
# Write your MySQL query statement below
select (case when id % 2 = 0 then id -1
when id = (select max(id) from seat) then id
else id + 1 end) as id,
student
from seat
order by id; ---- 156ms

解法二

通过左连接的方法。

---- MySQL ----
# Write your MySQL query statement below
select a.id,
ifnull(b.student, a.student) as student
from seat a
left join seat b
on (a.id % 2 = 1 && a.id = b.id -1) || (a.id % 2 = 0 && a.id = b.id + 1)
order by a.id ---- 135ms

真的很天才,佩服!

解法三

通过异或的方法,更是牛逼!

0 ^ 1 = 1

1 ^ 1 = 0

---- MySQL ----
select b.id,
a.student
from seat a,
seat b,
(select count(*) as cnt from seat) c
where b.id = 1 ^ (a.id - 1) + 1 || (c.cnt % 2 && b.id = c.cnt && a.id = c.cnt); ---- 132ms

如果是一个偶数^1,结果是偶数+1;

如果是一个奇数^1,结果是奇数-1;

(id -1 ) ^ 1 + 1 可以把1、2交换位置,3、4交换位置。

思考

MySQL 中的 ifnull() 函数用于判断第一个表达式是否为 null ,如果为 null 则返回第二个表达式的值。

异或操作,真是神,往往能达到意想不到的效果,get!

最新文章

  1. python generator: next , sent(msg)区别
  2. Linux下安装OpenCV+Python支持
  3. gulp基本介绍
  4. JSONObejct属性获取
  5. 2015GitWebRTC编译实录11
  6. java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比
  7. 数字图像处理-----主成成分分析PCA
  8. JavaWeb学习笔记--filter开发
  9. UNIX网络编程---TCP客户/服务器程序示例(五)
  10. open sql 更新数据
  11. Unity3d 4.3.4f1执行项目
  12. python sorted排序用法详解
  13. Android计时器实现
  14. beef + msf 实现内网渗透
  15. JVM垃圾回收算法及分代垃圾收集器
  16. R语言做一元线性回归
  17. @RequestBody jackson解析复杂的传入值的一个坑;jackson解析迭代数组;jackson多重数组;jakson数组
  18. 【leetcode 简单】 第八十九题 赎金信
  19. javascript用户密码加密,js密码加密
  20. 实现优先级队列 --heapq模块

热门文章

  1. angular 中父子路由
  2. Qt kdChart 甘特图案例
  3. 【转】Selenium-xpath详解
  4. vue.js 同级组件之间的值传递方法(uni-app通用)
  5. 利用Python获取cookie的方法,相比java代码简便不少
  6. delphi 根据特殊符号字符获取字符串前或后的字符
  7. jQuery跨域调用WebService
  8. 使用javamelody监控springboot项目
  9. Egret入门学习日记 --- 第九篇(书中 2.7~2.8节 内容)
  10. CF1210A Anadi and Domino