Medium
You are given an array nums
consisting of n
prime integers.
You need to construct an array ans
of length n
, such that, for each index i
, the bitwise OR
of ans[i]
and ans[i] + 1
is equal to nums[i]
, i.e. ans[i] OR (ans[i] + 1) == nums[i]
.
Additionally, you must minimize each value of ans[i]
in the resulting array.
If it is not possible to find such a value for ans[i]
that satisfies the condition, then set ans[i] = -1
.
Example 1:
Input: nums = [2,3,5,7]
Output: [-1,1,4,3]
Explanation:
i = 0
, as there is no value for ans[0]
that satisfies ans[0] OR (ans[0] + 1) = 2
, so ans[0] = -1
.i = 1
, the smallest ans[1]
that satisfies ans[1] OR (ans[1] + 1) = 3
is 1
, because 1 OR (1 + 1) = 3
.i = 2
, the smallest ans[2]
that satisfies ans[2] OR (ans[2] + 1) = 5
is 4
, because 4 OR (4 + 1) = 5
.i = 3
, the smallest ans[3]
that satisfies ans[3] OR (ans[3] + 1) = 7
is 3
, because 3 OR (3 + 1) = 7
.Example 2:
Input: nums = [11,13,31]
Output: [9,12,15]
Explanation:
i = 0
, the smallest ans[0]
that satisfies ans[0] OR (ans[0] + 1) = 11
is 9
, because 9 OR (9 + 1) = 11
.i = 1
, the smallest ans[1]
that satisfies ans[1] OR (ans[1] + 1) = 13
is 12
, because 12 OR (12 + 1) = 13
.i = 2
, the smallest ans[2]
that satisfies ans[2] OR (ans[2] + 1) = 31
is 15
, because 15 OR (15 + 1) = 31
.Constraints:
1 <= nums.length <= 100
2 <= nums[i] <= 109
nums[i]
is a prime number.class Solution {
fun minBitwiseArray(nums: List<Int>): IntArray {
val n = nums.size
val result = IntArray(n)
for (i in 0 until n) {
val num: Int = nums[i]
result[i] = -1
var p = 0
while (p < 31) {
if (((num shr p) and 1) == 0) {
break
}
p++
}
if (p > 0) {
result[i] = ((num shr p) shl p) or ((1 shl (p - 1)) - 1)
}
}
return result
}
}