[英雄星球七月集训LeetCode解题日报] 第10日 位运算
日报
- 多少有些水。
题目
一、 面试题 16.01. 交换数字
链接: 面试题 16.01. 交换数字
1. 题目描述
2. 思路分析
直接逆序。
3. 代码实现
class Solution:
def swapNumbers(self, numbers: List[int]) -> List[int]:
return list(reversed(numbers))
二、 1342. 将数字变成 0 的操作次数
1. 题目描述
2. 思路分析
直接模拟。
3. 代码实现
class Solution:
def numberOfSteps(self, num: int) -> int:
ans = 0
while num:
if num & 1:
num -= 1
else:
num >>= 1
ans += 1
return ans
三、 476. 数字的补数
链接: 476. 数字的补数
1. 题目描述
2. 思路分析
- 根据题意,找出数字一共有多少位,对每一位都异或1.
- 所以实际是要搞一个t,使这俩数位等长,但全是1.
3. 代码实现
class Solution:
def findComplement(self, num: int) -> int:
t = 0
for i in range(33):
if num >>i:
t|=(1<<(i))
else:
break
return num^t
四、 2044. 统计按位或能得到最大值的子集数目
1. 题目描述
2. 思路分析
- 首先,最大按位或的值tot一定等于所有数字或起来。
- 然后找组合起来等于tot的方案。
- 不要想的太复杂,数据范围是16,直接枚举即可。
3. 代码实现
class Solution:
def countMaxOrSubsets(self, nums: List[int]) -> int:
n = len(nums)
tot = reduce(or_, nums)
# print(tot)
ans = 0
def dfs(i,mask):
if i >= n:
if mask==tot:
nonlocal ans
ans += 1
return
dfs(i+1,mask|nums[i])
dfs(i+1,mask)
dfs(0,0)
return ans