位运算 bit_operation

常用的位运算有:
与&
或|
异或^
左移n位 a<<n
右移n位 a>>n

剑指offer15 二进制中1的个数

数字1和当前数做&运算可以得到当前位是否为1,然后数字1左移一位,再次得到下一位是否为1;以此类推

  • easy

  • 题目描述

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 [汉明重量];输入必须是长度为 32 的二进制串

  • 解题思路
class Solution:
    def hammingWeight(self, n: int) -> int:
        # 让数字1每次左移1位,并且和当前数做&运算
        count = 32
        temp = 1
        res = 0
        while(count):
            if n & temp:
                res += 1
            temp <<= 1
            count -= 1
        return res

剑指Offer65 不用加减乘除做加法

不考虑进位的加法等同于异或运算;进位的计算等同于与运算

  • easy
  • 题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

  • 解题思路
class Solution {
public:
    int add(int a, int b) {
        int i = 32;
        int c;
        while(i){
            i -= 1;
            c = a & b;
            a ^= b;
            b = unsigned(c) << 1;
        }
        return a;
    }
};

剑指Offer56-I 数组中数字出现的次数

所有数字进行异或得到的结果等同于仅出现一次的2个数(a和b)的异或结果,根据这个异或结果从最低位扫描出现的1的位置,可以将所有数分为2组,a和b会分到不同的组里,相同的数因为在这一位肯定是相同的所以会被分到一个组内,对这两个组分别异或,就得到a和b

  • medium
  • 题目描述

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

  • 解题思路
class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        # 将所有数字进行异或得到的结果是出现1次的2个数字进行异或的结果
        res = functools.reduce(lambda x, y: x^y, nums)
        # 找到res中从后往前等于1的位置,1表示这两个出现1次的数字在这个位置上是不同的,按照这个位置将所有数字分为2组,每组进行异或就得到
        temp = 1
        while(res & temp == 0):
            temp <<= 1
        a, b = 0, 0
        for i in nums:
            # 在2个出现一次的数字的首个不同位置,根据这个位置是0还是1分为2组
            # 这里不能写==1,因为temp不是仅仅在最低位有可能==1
            if i & temp:
                a ^= i
            else:
                b ^= i
        return [a, b]

剑指Offer56-II 数组中数字出现的次数 II

竖直位求和%3,如果结果是0表示当前出现一次的数字在该位就是0,否则表示在该位就是1

  • medium
  • 题目描述

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

  • 解题思路
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # 对每一位上的1求和,不是3的倍数就是3的倍数+1
        res = 0
        # 遍历每一位
        for i in range(32):
            bit = 0
            for n in nums:
                bit += n >> i & 1
            res += (bit % 3) << i
        return res

剑指Offer64 求1+2+…+n

短路效应代替if判断

  • medium
  • 题目描述

1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

  • 解题思路
class Solution:
    def sumNums(self, n: int) -> int:
        # 短路效应,平常终止递归用if语句判断,这里用n && 
        return n and n + self.sumNums(n-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值