1.异或运算
十进制的异或运算,先转成二进制进行异或,按位进行比较,对应位置相同则为0,对应位置不同则为1,,再从异或结果转成十进制。
python中:
1 ^ 1 = 0
1 ^ 2 = 3
1 ^ 0 = 1
0 ^ 1 = 1
1 的二进制0000 0001
2 的二进制0000 0010
1 ^ 2 的二进制是:0000 0011 换算成十进制为3
异或的交换律 1 ^ 0 = 0 ^ 1
异或的结合律 1 ^ 2 ^ 3 = 1 ^ (2 ^ 3)
一个非空整数列表,除了某个元素只出现一次外,其余每个元素均出现两次,找到只出现一次的元素,leetcode136
例如 [1,2,3,4,3,2,1]
异或的结合律和交换律
1 ^ 2 ^ 3 ^ 4 ^ 3 ^ 2 ^ 1 = 1 ^ 1 ^ 2 ^ 2 ^ 3 ^ 3 ^ 4 = 0 ^ 4 = 4 def solve(li): temp = li[0] for i in range(1,len(li)): temp = temp ^li[i] print(temp) 结果:4
一般解法:
def solve(li):
for i in range(len(li)):
ret = li.count(li[i])
if ret == 1:
print(li[i])
solve([1,2,3,4,3,2,1])
结果:4
1 - n 放在含有 n + 1 个元素的列表中,只有唯一的一个元素值重复,其他均只出现一次,每个列表元素只能访问一次,设计一个算法,将它找出来,不能使用辅助存储空间 Leetcode 287 分析:找出重复的元素。 1-5个元素的列表-- [1,2,3,4,5] 5+1个元素的列表---[0,1,2,3,4,5] [1,2,3,3,4,5] 找出3 同样的异或结合律和交换律 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 1 ^ 2 ^ 3 ^ 3 ^ 4 ^ 5 思路:一个数奇数次异或自己就是本身,偶数次异或自己就是0,要找出3,就让3自己异或自己奇数次。其他数异或自己偶数次,就可以了。 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 1 ^ 2 ^ 3 ^ 3 ^ 4 ^ 5 = 1 ^ 1 ^ 2 ^ 2 ^ 0 ^ 3 ^ 3 ^ 3 ^ 4 ^ 4 ^ 5 ^ 5 = 3 def sove(li): ret = 0 temp_li = [x for x in range(0,len(li)] for i in range(0, len(temp_li)) ret = ret ^ li[i] ^ temp_li[i] print(ret) sove([1,2,3,3,4,5]) 结果:3
2.按位运算
按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0
a = 1111 0100
b = 1001 1011
a & b = 1001 0000