1.题目基本信息
1.1.题目描述
给你一个长度为 n 的质数数组 nums 。你的任务是返回一个长度为 n 的数组 ans ,对于每个下标 i ,以下 条件 均成立:
- ans[i] OR (ans[i] + 1) == nums[i]
除此以外,你需要 最小化 结果数组里每一个 ans[i] 。
如果没法找到符合 条件 的 ans[i] ,那么 ans[i] = -1 。
质数 指的是一个大于 1 的自然数,且它只有 1 和自己两个因数。
1.2.题目地址
https://leetcode.cn/problems/construct-the-minimum-bitwise-array-ii/description/
2.解题方法
2.1.解题思路
二进制位运算
举个栗子:10011|10100=10111,可以看出x|(x+1)是将x最右边的0替换为1后的结果;所以求最小化结果,等价于求最低位0,将最低位0后面的1替换为0后的值,即为最小化结果
2.2.解题步骤
第一步,由题意易得数字不能是偶数,而质数中只有2为偶数,所以排除2
第二步,求最低位0后面的元素1。先取反,然后求最低有效位,再将最低有效位右移一位即为最低位0后面的1,记为a
第三步,将nums[i]与a做异或运算,得到目标元素
3.解题代码
python代码
class Solution:def minBitwiseArray(self, nums: List[int]) -> List[int]:# 思路:二进制位运算。10011|10100=10111,可以看出x|(x+1)是将x最右边的0替换为1后的结果;所以求最小化结果,等价于求最低位0,将最低位0后面的1替换为0后的值,即为最小化结果n = len(nums)result = [0] * nfor i in range(n):# 第一步,由题意易得数字不能是偶数,而质数中只有2为偶数,所以排除2if nums[i] == 2:result[i] = -1continue# 第二步,求最低位0后面的元素1。先取反,然后求最低有效位,再将最低有效位右移一位即为最低位0后面的1,记为ab = ~nums[i]a = (b & (-b)) >> 1# 第三步,将nums[i]与a做异或运算,得到目标元素result[i] = nums[i] ^ areturn result