题目描述:
给你一个下标从 0 开始的整数数组 nums
和一个正整数 k
。
你可以对数组执行以下操作 任意次 :
- 选择数组里的 任意 一个元素,并将它的 二进制 表示 翻转 一个数位,翻转数位表示将
0
变成1
或者将1
变成0
。
你的目标是让数组里 所有 元素的按位异或和得到 k
,请你返回达成这一目标的 最少 操作次数。
注意,你也可以将一个数的前导 0 翻转。比方说,数字 (101)2
翻转第四个数位,得到 (1101)2
。
题解:
class Solution {
public:
int minOperations(vector<int>& nums, int k) {
for(int x:nums){
k^=x;
}
return __builtin_popcount(k);
}
};
这里只需要关注异或运算的性质,异或具有交换律结合律,何时进行操作并不重要,因此可以看成先进行异或运算最后再对剩余的1进行处理。