题目:
思想:
- 首先位运算有三个特性:
- 任何数和0进行异或运算,结果仍然是原数,即 a XOR 0 = a。
- 任何数和自身进行异或运算,结果是0,即 a XOR a = 0。
- 异或运算满足交换律和结合律。首先,我们需要计算数组 nums 中所有元素的异或和,记为 xor_sum。我们的目标是通过翻转某些位来使 xor_sum 等于 k。
1
2
3
4
5a = 0b1001
b = 0b0110
bin(a ^ b)
'0b1111'
接着,我们可以考虑 xor_sum XOR k 的结果。由于异或运算的特性,任何位上的不同会导致结果中该位为1。这意味着,我们需要改变 xor_sum 和 k 在二进制表示中所有不同的位。
如果 xor_sum = 1010,k = 0011,那么 xor_sum XOR k = 1001。我们需要改变第一位和第四位来让 xor_sum 变成 k。
也就是说 nums的异或合
与 k
的异或的值, 其中1的数目就是需要转换的数目。可以看0x3f的解法
代码:
1 | class Solution: |
1 | func minOperations(nums []int, k int) int { |