LeetCode:626.换座位
题目
小美是一所中学的信息科技老师,她有一张 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!
LeetCode:626.换座位的更多相关文章
- Lc626_换座位
626. 换座位 SQL架构 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们相对应的座位 id. 其中纵列的 id 是连续递增的 小美想改变相邻俩学生的座位. ...
- mysql查询之上升的温度,有趣的电影,超过5名学生的课,大国,反转性别, 换座位
最近发现一个网站 力扣 查看 上面有很多算法和数据库的题目,做了一下,发现自己平时都疏忽了,因此边做边记录下来 1.上升的温度 给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天 ...
- [SQL]LeetCode626. 换座位 | Exchange Seats
SQL架构 Create table If Not Exists seat(id )) Truncate table seat insert into seat (id, student) value ...
- LeetCode.1217-交换芯片(Play with Chips)
这是小川的第次更新,第篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第270题(顺位题号是1217).There are some chips, and the i-th ch ...
- 【bzoj4720】【noip2016】【换座位】期望dp+Floyd
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62370736 wa...已经快一年了,重新来做这 ...
- Java实现 LeetCode 1227 飞机座位分配概率
1227. 飞机座位分配概率 有 n 位乘客即将登机,飞机正好有 n 个座位.第一位乘客的票丢了,他随便选了一个座位坐下. 剩下的乘客将会: 如果他们自己的座位还空着,就坐到自己的座位上, 当他们自己 ...
- 力扣Leetcode 1518. 换酒问题
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒.你购入了 numBottles 瓶酒. 如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的. 请你计算 最多 能喝到多少瓶酒. 示例: ...
- LeetCode - 626. Exchange Seats
Mary is a teacher in a middle school and she has a table seat storing students' names and their corr ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
随机推荐
- Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突
Android插件化(六): OpenAtlasの改写aapt以防止资源ID冲突 转 https://www.300168.com/yidong/show-2791.html 核心提示:引言And ...
- 18Flutter中的路由、路由替换、返回到根路由:
路由: 正常跳转: Navigator.pushNamed(context,'/product'); 路由替换: Navigator.pushReplacementNamed(context, ' ...
- LeetCode_88. Merge Sorted Array
88. Merge Sorted Array Easy Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 ...
- 第一次linux下安装nginx记录
CentOS 7 安装Nginx 并配置自动启动 1.下载Nginx安装包---->地址:http://nginx.org/en/download.html 2.上传安装包到服务期 : rz 命 ...
- iOS-SDWebImage使用(转)
SDWebImage提供了如下三个category来进行缓存. MKAnnotationView(WebCache) UIButton(WebCache) UIImageView(WebCache) ...
- destoon 6.0 手机站支持在所有浏览器访问
我们的在本地调试destoon 6.0的手机站模板时,用浏览器的自带审查元素很不方便. 可是destoon 默认是在电脑端打不开手机站,如果这个设置能够去除掉,那就可以了. 去掉这个限制,指需要两步 ...
- C/C++.控制台输入(cin/getchar)
1.类似的函数有:cin.getchar.fgetc 等 2.问题: 最后的"\n"都不取出来... 2.1.对策:(ZC:下面是 我自己使用后的感受) (1)fflush(std ...
- shell 批量重命名
原文链接https://www.cnblogs.com/sunmmi/articles/6709125.html shell 批量重命名 1.把文件名的第一字母批量改成a 方法一: 1 2 3 4 ...
- NationalInstruments project
//using NationalInstruments.NI4882; //请将项目文件中的"AutoGenerateBindingRedirects"属性设置为true //ht ...
- Word 查找替换高级玩法系列之 -- 将换行符替换成回车符
我们从网上Copy过来的很多Word文档,里面使用的都是换行符,也就是我们常说的软回车,它显示为一个向下的箭头.这些符号不仅碍眼,而且会影响我们后期的排版,尤其是对段落的排版,因为Word里面的段落只 ...