LC 1734. 解码异或后的排列
https://leetcode-cn.com/problems/decode-xored-permutation/
这题有点意思,突破口就在于怎么找到 `perm[0]`, 另外这里还有个很重要的限制是n是奇数。
可以试探一下组合 `encoded` 里面的元素,看能够搞出些什么东西来:
- encoded[i] ^ encoded[i+1] = perm[i] ^ perm[i+1] ^ perm[i+1] ^ perm[i+2] = perm[i] ^ perm[i+2].
- XOR(encoded) = perm[0] ^ perm[n-1]
- XOR(encoded[i..j]) = perm[i] ^ perm[j+1]
所以我们其实可以计算出 perm[0] ^ perm[1], perm[0] ^ perm[2], … perm[0] ^ perm[n-1].
同时n又是奇数,所以如果把上面这些式子放在一起XOR的话,那么就可以得到 `perm[1] ^ perm[2] … perm[n-1]`.
然后我们又知道perm是1到n的排列,所以其实就知道 `perm[0] ^ … perm[n-1]`, 然后在和上面式子进行xor, 就可以得到perm[0].
from typing import List class Solution: def decode(self, encoded: List[int]) -> List[int]: # encoded[i] = perm[i] ^ perm[i+1] # get p0^p1, p0^p2 ... p0^p(n-1) # them xor all which is p1^p2^...p(n-1) as A # then we know 1^2^...n as B # then we know p0 = A ^ B n = len(encoded) + 1 B = 0 for i in range(1, n+1): B = B ^ i t = 0 A = 0 for x in encoded: t = t ^ x A = A ^ t p0 = A ^ B ans = [p0] t = 0 for x in encoded: t = t ^ x ans.append(t ^ p0) return ans