leetcode----位运算(python)

位运算基本知识

位运算概述

1.与(&)运算的用途

a)清零:如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零得数值相与,结果为0;

例如:0&a=0

b) 取一个数的指定位

例如:取数X=1010 1100的前四位,令Y=0000 1111,则X&Y=0000 1110

c) 判断奇偶:奇数末位为1,偶数末位为0,则 a&1==0 为偶数否则为奇数

2.异或(^)的用途

a)翻转指定位

例如:X=1010 1110 的第四位进行翻转,只需零Y的前四位为1,其余为哦,即Y=0000 1111,X^Y=1010 0001

b) 与零相异或值不变

c)交换两个数

d) 无进位相加 11^1=10

3.取反(~)

a&~0=a,

a&~1=a-1(a为奇数)or a(a为偶数)

leetcode例题

汉明距离

题目描述:两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:0 ≤ x, y < 231.
思路分析:根据汉明距离的定义,我们可以利用异或运算,异或运算,如果对应二进制的数相同为0,不同为1,因为我们统计两个数相异或之后,有多少个位置是1就可以了,统计利用右移运算。

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        num = 0
        z = x^y
        while z!=0:
            num += z&1
            z = z>>1
        return num

只出现一次的整数

题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次(偶数)。找出那个只出现了一次的元素。

思路分析:(1)一个数组除了一个元素出现一次其余都出现两个,则出现两次的元素异或为0,而0与任何数异或值不变,那么我们用0与数组中每个元素异或,最后剩下的数就是那个出现一次的数;时间复杂度为O(n)

(2)我们统计数组中不重复的元素,令这些元素的和乘以2,这里我们多算了一个只出现一次的元素的值,因此将其与原数组相减得到的就是我们需要求的数。
在这里插入图片描述

只出现一次的数字(奇数)

题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

思路分析:(1)哈希表,空间换时间。

(2)位运算,如果我们能将一个数出现三次的时候能自动抵消为0的时候,最后剩下的就是只出现一次的数了。

(3)数学推导
在这里插入图片描述

二进制1的个数

题目描述:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

思路分析:(1)首先想到的是利用与运算,将该整数转换为二进制,每一位和1做与&运算,看看有多少个1。时间复杂度为O(logn)

(2)巧用n&(n-1),n-1意味着二进制数字 n 最右边的 1 变成 0 ,此 1 右边1的 0都变成 1,那么n&(n-1)则将n最右边1变成0,其余不变,即n有几个1我们就能做几次运算直到n为0;
在这里插入图片描述

交换数字

题目描述:编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。

思路分析
(1)[a,b]\rightarrow [a-b,b]\rightarrow [a-b,b+(a-b)]\rightarrow [b+(a–b)-(a-b),a]\rightarrow [b,a]

(2) 我们知道异或的一个用途就是交换两个数,(ab)b=a,(ab)a=b
在这里插入图片描述

比特位计数

题目描述:给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。输入: 5 输出: [0,1,1,2,1,2]。
思路分析:(1)遍历0<=i<=num间的每一个数,然后求每个数的二进制数中的1的个数。我们知道求二进制数的1的个数,可以通过 n&(n-1)来求,n&(n-1)等于将n最右边的1变成0,
(2)奇偶数的动态规划
奇数的二进制数中的1的个数比它前一个数(偶数)的个数多一个,也就是它前一个数(偶数)最后一位的0变成1。
偶数的二进制数中1的个数等于它除以2的那个数的1的个数。
这样就可以利用动态规划来求解了,每个数可以通过之前求得数来得到。

class Solution:
    def countBits(self, num: int) -> List[int]:
        result = [0]*(num+1)
        for i in range(1,num+1):
            if 1 & i:
                result[i] = result[i-1] + 1
            else:
                result[i] = result[int(i/2)]
        return result

注意列表索引是整型,result[int(i/2)] 要加上int。

判断字符是否唯一

题目描述:”实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
思路分析:(1)可以使用数据结构的话,用字典,或者哈希表都可以达到
(2)使用位运算:首先要看字符串是否是ASCII码,如果是,那么字符串长度大于128,那么一定是False
我们可以使用一个int变量记录相应的字符是否出现,首先通过计算字符char离“a”的距离d,然后利用位移,将对应的位置置为1,即通过将1左移d个位置记为move_bit,再与mark做与运算,与运算,都为1才为1,所以如果出现重复的字符,那么与运算后为0,否则,令mark与move_bit做或运算,保留1的位置。

class Solution:
    def isUnique(self, astr: str) -> bool:
        #return len(set(astr))==len(astr)
        mark = 0
        for char in astr:
            move_bit = ord(char)-ord("a")
            if mark&(1<<move_bit)!=0:
                return False
            else:
                mark |= 1<<move_bit
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值