一、题目
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。
它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。
给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。
二、思路
由于给出的是已经进行加密数组,且不给第一个或最后一个数字,那么就需要自己去求解第一个或最后一个数字:
(这里有个很不容易理解的地方,“它是前 n 个正整数的排列”指就是1-n的数字的随机排列,包含了{1,2,…,n})
根据异或操作,对于任意数字num,有num^num=0,num^0=num,偶数个数字进行了异或操作,就可以消除该数字。可以利用这一特性来对其他元素进行消除。其实可以设定xor1ToN为perm[1]^perm[2]…perm[n],设定xor0ToN为perm[0]^perm[1]…perm[n],然后perm[0]=xor1ToN^xor0ToN。
使用encoded代替perm,可以得到:
xor1ToN=perm[1]^perm[2]…perm[n]=encoded[1]^encoded[3]…encoded[n]
xor0ToN=1^2^…^n
三、代码
class Solution {
public int[] decode(int[] encoded) {
int[] ans = new int[encoded.length + 1];
int xor1ToN = 0, xor0ToN = 0;
for (int i = 1; i < encoded.length; i+=2) {
xor1ToN ^= encoded[i];
}
for (int i = 1; i <= encoded.length+1; i++) {
xor0ToN ^= i;
}
ans[0] = xor0ToN ^ xor1ToN;
for (int i = 0; i < encoded.length; i++) {
ans[i+1] = ans[i] ^ encoded[i];
}
return ans;
}
}