列表

详情


100168. 使数组异或和等于 K 的最少操作次数

给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。

你可以对数组执行以下操作 任意次 :

你的目标是让数组里 所有 元素的按位异或和得到 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 。所以不需要进行任何操作。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minOperations(vector<int>& nums, int k) { } };

golang 解法, 执行用时: 108 ms, 内存消耗: 7.9 MB, 提交时间: 2024-01-07 11:45:51

func minOperations(nums []int, k int) int {
	for _, x := range nums {
		k ^= x
	}
	return bits.OnesCount(uint(k))
}

cpp 解法, 执行用时: 120 ms, 内存消耗: 86.9 MB, 提交时间: 2024-01-07 11:45:37

class Solution {
public:
    int minOperations(vector<int> &nums, int k) {
        for (int x : nums) {
            k ^= x;
        }
        return __builtin_popcount(k);
    }
};

java 解法, 执行用时: 1 ms, 内存消耗: 55.6 MB, 提交时间: 2024-01-07 11:45:25

class Solution {
    public int minOperations(int[] nums, int k) {
        for (int x : nums) {
            k ^= x;
        }
        return Integer.bitCount(k);
    }
}

python3 解法, 执行用时: 52 ms, 内存消耗: 28.8 MB, 提交时间: 2024-01-07 11:45:12

'''
设 nums 的异或和为 s。
s=k 等价于 s⊕k=0,其中 ⊕ 表示异或。
设 x=s⊕k,我们把 nums 中的任意数字的某个比特位翻转,那么 x 的这个比特位也会翻转。
要让 x=0,就必须把 x 中的每个 1 都翻转,所以 x 中的 1 的个数就是我们的操作次数。
'''
class Solution:
    def minOperations(self, nums: List[int], k: int) -> int:
        return (reduce(xor, nums) ^ k).bit_count()

上一题