剑指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

原文地址:https://www.cnblogs.com/yxl-2018/p/12392265.html