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