comments | difficulty | edit_url | rating | source | tags | ||
---|---|---|---|---|---|---|---|
true |
中等 |
1524 |
第 121 场双周赛 Q2 |
|
给你一个下标从 0 开始的整数数组 nums
和一个正整数 k
。
你可以对数组执行以下操作 任意次 :
- 选择数组里的 任意 一个元素,并将它的 二进制 表示 翻转 一个数位,翻转数位表示将
0
变成1
或者将1
变成0
。
你的目标是让数组里 所有 元素的按位异或和得到 k
,请你返回达成这一目标的 最少 操作次数。
注意,你也可以将一个数的前导 0 翻转。比方说,数字 (101)2
翻转第四个数位,得到 (1101)2
。
示例 1:
输入:nums = [2,1,3,4], k = 1 输出:2 解释:我们可以执行以下操作: - 选择下标为 2 的元素,也就是 3 == (011)2 ,我们翻转第一个数位得到 (010)2 == 2 。数组变为 [2,1,2,4] 。 - 选择下标为 0 的元素,也就是 2 == (010)2 ,我们翻转第三个数位得到 (110)2 == 6 。数组变为 [6,1,2,4] 。 最终数组的所有元素异或和为 (6 XOR 1 XOR 2 XOR 4) == 1 == k 。 无法用少于 2 次操作得到异或和等于 k 。
示例 2:
输入:nums = [2,0,2,0], k = 0 输出:0 解释:数组所有元素的异或和为 (2 XOR 0 XOR 2 XOR 0) == 0 == k 。所以不需要进行任何操作。
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 106
0 <= k <= 106
我们可以将数组
时间复杂度
class Solution:
def minOperations(self, nums: List[int], k: int) -> int:
return reduce(xor, nums, k).bit_count()
class Solution {
public int minOperations(int[] nums, int k) {
for (int x : nums) {
k ^= x;
}
return Integer.bitCount(k);
}
}
class Solution {
public:
int minOperations(vector<int>& nums, int k) {
for (int x : nums) {
k ^= x;
}
return __builtin_popcount(k);
}
};
func minOperations(nums []int, k int) (ans int) {
for _, x := range nums {
k ^= x
}
return bits.OnesCount(uint(k))
}
function minOperations(nums: number[], k: number): number {
for (const x of nums) {
k ^= x;
}
return bitCount(k);
}
function bitCount(i: number): number {
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}