[逐日一练]利用“笛卡尔合并”判定数据是否连续

打印 上一主题 下一主题

主题 1945|帖子 1945|积分 5835

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#该题目泉源于力扣:
603. 连续空余座位 - 力扣(LeetCode)
题目要求:

  1. 表: Cinema
  2. +-------------+------+
  3. | Column Name | Type |
  4. +-------------+------+
  5. | seat_id     | int  |
  6. | free        | bool |
  7. +-------------+------+
  8. Seat_id 是该表的自动递增主键列。
  9. 在 PostgreSQL 中,free 存储为整数。请使用 ::boolean 将其转换为布尔格式。
  10. 该表的每一行表示第 i 个座位是否空闲。1 表示空闲,0 表示被占用。
  11. 查找电影院所有连续可用的座位。
  12. 返回按 seat_id 升序排序 的结果表。
  13. 测试用例的生成使得两个以上的座位连续可用。
  14. 结果表格式如下所示。
  15. 示例 1:
  16. 输入:
  17. Cinema 表:
  18. +---------+------+
  19. | seat_id | free |
  20. +---------+------+
  21. | 1       | 1    |
  22. | 2       | 0    |
  23. | 3       | 1    |
  24. | 4       | 1    |
  25. | 5       | 1    |
  26. +---------+------+
  27. 输出:
  28. +---------+
  29. | seat_id |
  30. +---------+
  31. | 3       |
  32. | 4       |
  33. | 5       |
  34. +---------+
复制代码
思路流程:

何谓笛卡尔合并?就是描述两个数据集间所有可能的组合。

简而言之,就是判定返回连续free列的值为1,且超过2个及其以上的所有对应seat_id的数据。
判定是否连续,且连续的要求要大于即是三个,判定连续的条件,不妨先对这张表做一个笛卡尔合并:
  1. # Write your MySQL query statement below
  2. select *
  3. from cinema as a, cinema as b
复制代码
可见,笛卡尔合并后的数据为:
  1. | seat_id | free | seat_id | free |
  2. | ------- | ---- | ------- | ---- |
  3. | 5       | 1    | 1       | 1    |
  4. | 4       | 1    | 1       | 1    |
  5. | 3       | 1    | 1       | 1    |
  6. | 2       | 0    | 1       | 1    |
  7. | 1       | 1    | 1       | 1    |
  8. | 5       | 1    | 2       | 0    |
  9. | 4       | 1    | 2       | 0    |
  10. | 3       | 1    | 2       | 0    |
  11. | 2       | 0    | 2       | 0    |
  12. | 1       | 1    | 2       | 0    |
  13. | 5       | 1    | 3       | 1    |
  14. | 4       | 1    | 3       | 1    |
  15. | 3       | 1    | 3       | 1    |
  16. | 2       | 0    | 3       | 1    |
  17. | 1       | 1    | 3       | 1    |
  18. | 5       | 1    | 4       | 1    |
  19. | 4       | 1    | 4       | 1    |
  20. | 3       | 1    | 4       | 1    |
  21. | 2       | 0    | 4       | 1    |
  22. | 1       | 1    | 4       | 1    |
  23. | 5       | 1    | 5       | 1    |
  24. | 4       | 1    | 5       | 1    |
  25. | 3       | 1    | 5       | 1    |
  26. | 2       | 0    | 5       | 1    |
  27. | 1       | 1    | 5       | 1    |
复制代码
可见笛卡而合并描述了两个聚集的所有可能的有序对组合。我们在捋清了每个笛卡尔组合的逻辑后,再进行后续的分析。
首先判定它们是否相邻,由上表可知,笛卡尔合并包罗了所有的组合情况,而且seat_id列是有先后顺序的。所有效a表和b表的seat_id互减,取绝对值为1,就可以判定出二者是相邻的。同时,要判定两个及其以上的座位都为空,那么要求a表和b表的free列的值都为1。逻辑如下:
  1. # Write your MySQL query statement below
  2. select *
  3. from cinema as a, cinema as b
  4. where abs(a.seat_id-b.seat_id)=1 and a.free=1 and b.free=1;/*| seat_id | free | seat_id | free || ------- | ---- | ------- | ---- || 4       | 1    | 3       | 1    || 5       | 1    | 4       | 1    || 3       | 1    | 4       | 1    || 4       | 1    | 5       | 1    |*/
复制代码
由此可见,所有相邻的,符合条件的座位号全部列了出来。但它们之间有空值,而且并未排序,我们对其稍加处置处罚,即可办理这个问题。
代码实现:

  1. # Write your MySQL query statement below
  2. select distinct a.seat_id
  3. from cinema as a, cinema as b
  4. where abs(a.seat_id-b.seat_id)=1 and a.free=1 and b.free=1
  5. order by a.seat_id ASC
复制代码
 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表