LEETCODE位运算-python

"""
python中二进制表示:0b1111
函数:bin(num)
基本操作:与&    或|    非~     异或^    左移<<
1-汉明重量:统计一个数中,1的数量。
python函数:bin(num).count('1')
"""
while (num != 0):
    num &= (num-1)
    cnt += 1

'''
2-汉明距离:两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目
解题思路:异或之后,统计1的数量
测试用例:大于等于0,小于等于32位
python函数:bin(x^y).count('1')
'''
def hammingDistance(x,y):
    num = x^y
    cnt = 0
    while num != 0:
        num &= (num-1)
        cnt += 1
    return cnt

'''
3-只出现一次的数字I,II,III:
I:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。

II:除了某个元素只出现一次以外,其余每个元素均出现了三次。
解题思路:两次用一位寄存器,三位需要用到两位寄存器。
它是一个逻辑电路,a、b变量中,相同位置上,分别取出一位,
负责完成00->01->10->00,也就是开头的那句话,当数字出现3次时置零。
先带入一位,即a,b,num都是一位,三次出现num为1的时,进行理解即可。不要带入数值,带入一位。
第一次b=1,第二次出现a=1,第三次出现a=b=0.

III:其中恰好有两个元素只出现一次,其余所有元素均出现两次。
解题思路:先全部异或一次, 得到的结果, 结果有1的位置必然是两个数不同位的地方。
用这一点将数分为两堆,分别进行I的解法。
'''
#def One:全部异或即可,虽然简单,但很多题目都是这个的扩展。

def Two(nums):
    a,b = 0,0
    for num in nums:
    	b = ~a & (b ^ num)
    	a = ~b & (a ^ num)
    return b

def Three(nums):
    diff = 0
    for num in nums:
        diff ^= num
    diff &= -diff#可以取出一位不同bit的位置。
    
    sol = [0, 0]
    for num in nums:
        if num & diff:#将数分为两堆。
            sol[0] ^= num
        else:
            sol[1] ^= num
    return sol

'''
4-异或:相同为0,不同为1,字母不能异或,只有数字可以。
num = ord(char)
char = chr(num)
经典例题:
One数字的补数:补数是对该数的二进制表示取反。
Two交替位二进制:换句话说,就是他的二进制数相邻的两个位数永不相等,01交替。
'''
#解题思路:找一个2**n大于num的数,然后减一与num异或。
#测试用例:0不是正整数,最小为1.
def One(num):
    n = 1
    while n <= num:
        n <<= 1
    return num^(n-1)

def Two(num):
    temp = n^(n>>1)#判断异或之后是否全为1
    return temp&(temp+1)==0


#判断是否为2的次幂:
num & (num-1)==0
#获取数值的某些二进制位:
num & 0b1111
#获取数值第一个二进制1:
num & -num
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值