• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

向小园

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

剑指offer 位运算

目录
  • T40-数组中只出现一次的数字
    • cpp待添加
    • 常规方法用哈希表就可以 这里用位运算 py2
  • T10-二进制中1的个数
    • cpp待补充
    • 位运算 py2
  • T11-数值的整数次方

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

posted on 2020-03-01 21:37  向小园  阅读(129)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3