python奇数位丢弃_位运算有什么奇技淫巧?

本文记录了一名商科学生在LeetCode刷题时对SQL和位运算的初识,通过两个具体的题目展示了如何使用位运算解决实际问题,包括找出id为奇数且描述不无聊的电影,以及通过位运算交换相邻座位的学生。位运算的简洁性和高效性给作者留下了深刻印象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为一名不会sql的商科学生,在毕业即失业的恶势力下

低头在LeetCode刷数据库……

期间有幸遇到几次位运算,留下了深刻的印象,并被它的巧妙所折服。

第一题:620.有趣的电影

某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。

作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。

例如,下表cinema:

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

| id | movie | description | rating |

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

| 1 | War | great 3D | 8.9 |

| 2 | Science | fiction | 8.5 |

| 3 | irish | boring | 6.2 |

| 4 | Ice song | Fantacy | 8.6 |

| 5 | House card| Interesting| 9.1 |

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

对于上面的例子,则正确的输出是为:

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

| id | movie | description | rating |

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

| 5 | House card| Interesting| 9.1 |

| 1 | War | great 3D | 8.9 |

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

来源:力扣(LeetCode)

链接:力扣

涉世未深的我,

一边吐槽着为啥要找奇数的片子

一边用mod(id,2)=1做出了答案

然后照惯例欣赏评论区的大佬答案

于是接下来我就有了第一次和位运算接触的经历:

id & 1

这个简洁的表达一下子就吸引了我,看了别人的解释我才直到原来这是位运算,二进制中,偶数最后一位是0,奇数是1,按位运算的话,0&1就是0,1&1就是1

至此,我对这种神秘又精简的运算方法留下了深刻的印象,

于是乎马上我又遇到了它,而这一次它真正的震撼了我哈哈哈哈~

第二题 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 |

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

注意:

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

来源:力扣(LeetCode)

链接:力扣

本渣第一次看到这题毫无头绪,满脑子想着根据奇偶分开处理,直到我看到评论区的大佬用位运算一笔带过……

select rank() over(order by (id-1)^1) as id,student from seat大佬用与1 异或,将奇数偶数互换,又用-1对最后一行为奇数行的情况进行处理。

直接秒杀!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值