位运算
笔记
1.基本和C++一样,然后有个思想,就是把数看成集合
a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)
就看一下第一个,把(1<<i),a看成一个集合,|相当于是并集运算(对应位有1就变为1,跟两个集合中一个有,一个没有某个元素,并集就有这个元素对应)
a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
2.还有,负数的补码和负数的绝对值之和是256,这样就可以快速计算负数对应的补码的数值
3.Python中bin
一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,比如:print(bin(-3)) # -0b11
4.python自带高精度
练习题
leetcode 习题 136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
尝试使用位运算解决此题。
题目说明:
"""
Input file
example1: [2,2,1]
example2: [4,1,2,1,2]
Output file
result1: 1
result2: 4
"""
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# your code here
解:
class Solution:
def singleNumber(self, nums: list) ->int:
i=list(set(nums))
for j in i:
nums.remove(j)
for j in nums:
i.remove(j)
return i[0]
b=Solution()
a=input("请输入一列数")
a=a.strip('[')
a=a.strip(']')
c=a.split(',')
print(b.singleNumber(c))
结果:
请输入一列数[2,2,1]
1
请输入一列数[4,1,2,1,2]
4
分析,感觉做麻烦了,先是处理输入,去掉[ ], 然后对‘,’进行切片得到列表
调用函数,
然后函数的设计思路是先通过转化为set去重,再转化回来,然后将原来的列表除去去重后的列表(这样原列表中只有一个的数字就没了),然后再在去重的列表中除去处理后的原列表,就得到了结果
又想到一个方法:
class Solution:
def singleNumber(self, nums: list) ->int:
b=[]
for i in nums:
if i in b:
b.remove(i)
else :
b.append(i)
return b[0]
b=Solution()
a=input("请输入一列数")
a=a.strip('[')
a=a.strip(']')
c=a.split(',')
print(b.singleNumber(c))
就是改了一下函数的处理,先准备一个空列表b,然后对nums进行遍历,如果这个数在b有就删除b中的这个数,否则就添加,这样出现两次的最终就不会出现在b中,这时返回b[0]即可