变量a=10,b=20,不借助第三个变量实现两变量值的交换。
1、算术运算
好久之前就看见过这道题,当时只知道是用异或^解决,后来也看到了有人用加减或乘除解决,这种算术运算很好理解代码贴在下面。
加减实现:
a = 10
b = 20
a = a + b
b = a - b
a = a - b
print(a, b) # 20 10
乘除实现:
a = 10
b = 20
a = a * b
b = a / b
a = a / b
print(a, b) # 20.0 10.0 小数点是因为python中除法结果为浮点型
2、异或(^)
对异或的简单概述就是相同为假(0),相异为真(1)。
异或操作主要的关键点在于:假设a^b=c,则c^b=a,c^a=b,也就是说一个数连续异或同一个数两次结果不变。
我们都知道计算机中数据都是以二进制形式存储的,现在任意假设两个变量a, b的二进制,a=101101,b=001010,a^b^b=a^(b^b),而根据异或的定义,任意数和自身异或都会等于0,例如上述b^b=001010^001010=000000。同样根据异或的定义,任何数和0异或都会等于这个数本身,就像a^0=101101^000000=101101。
搞清了异或的逻辑,代码就很容易写出来了
# 异或实现
a = 10
b = 20
a = a ^ b
b = a ^ b
a = a ^ b
print(a, b) # 20 10
3、python中的拆包装包
a = 10
b = 20
a, b = b, a
print(a, b) # 20 10
PS:关于异或的一道sql题
刷题时遇到,https://leetcode.cn/problems/exchange-seats/description/。
下面有个题解使用的是异或对相邻连续的两个id进行互换,用的是(id+1)^1-1
,下面记录下怎么理解这个式子。
首先一个数id^1,最终的结果分为两种情况:
1)id为奇数时,最后一位为1,^01只会改变最后一位为0,此时id^1=id-1。
2)id为偶数时,最后一位为0,^01只会改变最后一位为1,此时id^1=id+1。
对于 1, 2, 3, 4, … 这样的序列,要想奇偶之间两两交换成 2, 1, 4, 3, … 这样,只要保证所给序列第一位为偶数后面依次递增就行了,因此可以使用题解中的(id+1)^1-1
,后面-1是因为id在异或之前已经+1。按照这个思路将题解中的(id+1)^1-1
改成(id-1)^1+1
也是没问题的。
with t as(
select 1 as id union all
select 2 as id union all
select 3 as id union all
select 4 as id union all
select 5 as id union all
select 6 as id
)
select
id,
id^1,
(id+1)^1-1,
(id-1)^1+1
from t;