剑指offer 位运算
T40-数组中只出现一次的数字
cpp待添加
常规方法用哈希表就可以 这里用位运算 py2
# -*- coding:utf-8 -*-
class Solution:
# 返回[a,b] 其中ab是出现一次的两个数字
def FindNumsAppearOnce(self, array):
# write code here
val = 0
for num in array:
val = num^val
tmp = val
# for i in range(len(bin(val))-2):
# if tmp&1:
# bitnum = i
# else:
# tmp = tmp>>1
bitnum = 0
while tmp&1==0:
tmp = tmp>>1
bitnum += 1
res = [0,0]
for num in array:
if num&(1<<bitnum):
res[0]=res[0]^num
else:
res[1]=res[1]^num
return res
T10-二进制中1的个数
【解释一下】n = n & 0xffffffff,在Python中,数的大小是可以无限扩大的,不会像Java或c++中,数超过32位会溢出,而是继续扩张,所以对于一个负数而言,进行了这个操作,实际上是提取了负数的后32位(在计算机中以补码形式存在),前面的任意位呢,则变成了0,比如说 -1,一开始是 111.....(n个1)...11111111,进行与运算之后,得到,00....(n个0)....111111111(32个1),变成了含32个1的正数,然后就不用担心负数陷入死循环
cpp待补充
位运算 py2
# -*- coding:utf-8 -*-
class Solution:
def NumberOf1(self, n):
# write code here
if n<0:
n = n&0xffffffff
cnt = 0
while n:
cnt+=1
n = n&(n-1)
return cnt
T11-数值的整数次方
好像不需要位运算 注意double float型被乘数==0等价于 -0.0000001< <0.0000001