前言
第10天:位运算
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
位运算主要有如下几项操作:
一、练习题目
| 题目链接 | 难度 |
|---|---|
| 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)x与y进行异或操作,得到的即是两数字对应二进制位不同的数;
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
本文主要介绍在位运算方面的知识,并通过五个LeetCode题目,包括位1的个数、汉明距离以及三种不同情况下的只出现一次的数字问题,详细解析解题思路和位运算的应用。


310

被折叠的 条评论
为什么被折叠?



