【五月集训】Day10——位运算

本文主要介绍在位运算方面的知识,并通过五个LeetCode题目,包括位1的个数、汉明距离以及三种不同情况下的只出现一次的数字问题,详细解析解题思路和位运算的应用。


前言

        第10天:位运算
        从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
        位运算主要有如下几项操作:来源:RUNOOB.COM


一、练习题目

题目链接难度
191.位1的个数★☆☆☆☆
461. 汉明距离★☆☆☆☆
136. 只出现一次的数字★☆☆☆☆
137. 只出现一次的数字 II★★☆☆☆
260. 只出现一次的数字 III★★☆☆☆

二、思路与代码

1. 位1的个数

        题目描述:
        编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

解题思路:
        1)二进制数与1的交集若不为零,则说明该二进制数的末尾数字为一;
        2)每次将二进制数右移一位,统计末尾二进制数为一的个数。

class Solution(object):
    def hammingWeight(self, n):
        ans = 0
        while n :
            ans += (n & 1)
            n >>= 1
        return ans

2. 汉明距离

        题目描述:

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

解题思路:
        1)xy进行异或操作,得到的即是两数字对应二进制位不同的数;
        2)利用上一题的方法,统计返回数中值为1的个数即可。

class Solution(object):
    def hammingDistance(self, x, y):
        tmp = x ^ y
        ans = 0
        while tmp:
            ans += (tmp & 1)
            tmp >>= 1
        return ans

3. 只出现一次的数字

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

解题思路:
        1)若元素出现两次,则这两个元素异或值为零,利用这一特点,将数组中所有元素进行异或操作,最后得到的数字就是那个仅出现一次的元素。

class Solution(object):
    def singleNumber(self, nums):
        ans = 0
        for num in nums:
            ans ^= num
        return ans

4. 只出现一次的数字 II

        题目描述:
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

解题思路:
        1)统计数组中所有元素二进制同一位置处1的个数,若可以被三整除说明待查找元素在该位置处为零,反之为一;
        2)将不同二进制位置处大小为1的数加和即可。

class Solution(object):
    def singleNumber(self, nums):
        
        ans = 0
        for i in range(32): #根据题目提示,数组中的元素num[i]的范围为[-2^31, 2^31]
            total = 0
            for num in nums:
                num >>= i
                total += (num&1)
            if total % 3 != 0:
                if i == 31:  # 针对python语句中,无符号整数类型,第31个二进制数对应2^31,与有符号整数类型第31个二进制数对应-2^31,所以针对这点,须额外判别
                    ans -= (1 << i) 
                else:    
                    ans += (1 << i)
        return ans

5. 只出现一次的数字 III

        题目描述:
        给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序返回答案。

解题思路:
        有点比较难想到,我就直接放上参考答案吧:解题思路

class Solution(object):
    def singleNumber(self, nums):
        xorSum, pos = 0, 0
        for num in nums:
            xorSum ^= num
        pos = xorSum & (-xorSum)
        p1, p2 = 0, 0
        for num in nums:
            if (num & pos):
                p1 ^= num
            else:
                p2 ^= num
        return [p1, p2]


参考资料
[1]《只出现一次的数字》精选解答:https://leetcode.cn/problems/single-number-ii/solution/single-number-ii-mo-ni-san-jin-zhi-fa-by-jin407891/
[2]位运算:https://www.runoob.com/w3cnote/bit-operation.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值