class Solution {
public:
int minOperations(vector<int>& nums, int k) {
}
};
100168. 使数组异或和等于 K 的最少操作次数
给你一个下标从 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
原站题解
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()