給你一個整數數組 perm ,它是前 n 個正整數的排列,且 n 是個 奇數 。
它被加密成另一個長度為 n - 1 的整數數組 encoded ,滿足 encoded[i] = perm[i] XOR perm[i + 1] 。比方說,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。
給你 encoded 數組,請你返回原始數組 perm 。題目保證答案存在且唯一。
示例 1:
輸入:encoded = [3,1]
輸出:[1,2,3]
解釋:如果 perm = [1,2,3] ,那么 encoded = [1 XOR 2,2 XOR 3] = [3,1]
示例 2:
輸入:encoded = [6,5,4,6]
輸出:[2,4,1,5,3]
解題思路
設x=1 ^ 2 ^ 3 ^ …^n
那么perm[0]=x ^ encoded[1] ^ encoded[3]…
因為encoded[i] = perm[i] XOR perm[i + 1],所以perm[i + 1]=encoded[i] XOR perm[i]
若知道了perm[0]自然可以推出perm[1],如此類推,就可以推出所有
推導
為什么可知perm[0]=x ^ encoded[1] ^ encoded[3]…?
因為encoded[1] = perm[1] XOR perm[2] ,encoded[3] = perm[3] XOR perm[4]…
因此可得encoded[1] ^ encoded[3]…= perm[1]^ perm[2]^ perm[3]^ perm[4]…
又因為perm是前 n 個正整數的排列,所以
perm[0]perm[1] perm[2]^ perm[3]^ perm[4]…=1 ^ 2 ^ 3 ^ …^n=x
因此可得perm[0]=x ^ encoded[1] ^ encoded[3]…
代碼
func decode(encoded []int) []int {n:=len(encoded)+1odd:=0for i := 1; i < len(encoded) ; i+=2 {odd^=encoded[i]}all:=0for i := 1; i <=n ; i++ {all^=i}pre:=all^oddres := make([]int, n)res[0]=prefor j, code := range encoded {cur:=pre^coderes[j+1]=curpre=cur}return res
}