换座位[异或巧妙的让奇偶互换]

本文探讨如何通过位运算巧妙地交换奇数和偶数ID的字段,包括直接法和转换法。直接法利用联表操作,转换法则通过问题转换和奇偶异或实现。这些方法展示了位运算在数据处理中的高效应用,同时也强调了问题转换能力的重要性。
摘要由CSDN通过智能技术生成

前言

将奇数id和偶数id的其他字段交换,同时考察转换问题能力 & 直接分析能力。如 换其他字段 和 换id是镜像对称的,换了其他字段就等同于换了id。

一、换座位

在这里插入图片描述

二、直接法 & 转换法 + 巧妙异或

1、直接法

# 直接法,联表。

with view4base as(
    select s1.id,s1.student,s2.student next
    from Seat s1 left join Seat s2 on s1.id & 1 = 1 and s1.id + 1 = s2.id or s1.id & 1 = 0 and s1.id - 1 = s2.id
)
select
    id,
    if(next is null,student,next) student
from view4base

# 直接法,联表改进。

with view4base as(
    select s1.id,s1.student,s2.student next
    from Seat s1 left join Seat s2 on (s1.id + 1) ^ 1 - 1 = s2.id # 让奇数先加一再加一,让偶数先加一再减一 一直不变,两者减一即可。
)
select
    id,
    if(next is null,student,next) student
from view4base

2、转换法

# 问题转换法,把它们id换了再排序。
select
    case
        when total & 1 = 1 and id = total then id
        when id & 1 = 1                   then id + 1
        when true                         then id - 1
    end id,
    student
from Seat,(select max(id) total from Seat) t # 巧用笛卡儿积,而不是窗口函数。
order by id

# 问题转换法,巧妙的奇偶交换。
select
    if(total & 1 = 1 and total = id,id,(id + 1) ^ 1 - 1) id,
    student
from Seat,(select max(id) total from Seat) t # 巧用笛卡儿积,而不是窗口函数。
order by id

总结

1)巧妙的异或位运算,让奇偶数互换。
2)多锻炼问题转换的能力,如换id 和 换其他字段,是镜像对称的,换了id不就等同于换了其他大把字段,像是四两拨千斤的感觉。又比如筛选记录时,筛选了外键即另一张表的主键,就筛选除了特定信息,不一定要联表来做。

参考文献

[1] LeetCode 换座位

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值