这个类型的简单题是多给了一个perm[0]的条件:
perm[i]=perm[i-1]^encoded[i-1];(i从1开始)
这一题,缺了一个perm[0],所以我们的目标就是求解perm[0],就要利用这一题中的两个条件。
1 perm是前n个正整数的排列,利用这个条件可以得到perm所有元素的异或ABCDE。即ABCDE=perm[0] ^ perm[1] ^ perm[2] ^ … ^ perm[n]
2 perm的size是个奇数,那么size-1就是一个偶数,那么用encoded中下标为奇数的元素进行异或得到BCDE。
encoded[i]=perm[i+1 ]^ perm[i],i从1开始,i+=2,
encoded[1]=perm[2] ^ perm[1],
encoded[3]=perm[4]^ perm[3],
…
encoded[n-1]=perm[n]^perm[n-1];
所以BCDE=perm[1] ^ perm[2] ^ … ^ perm[n],
那么perm[0]=ABCDE ^ BCDE。从而我们求得了perm[0]的值。把问题转换回到简单题了。
class Solution {
public:
vector<int> decode(vector<int>& encoded) {
int n=encoded.size();
//那么perm的size应为n+1
//perm为前n+1个正整数,求出这n+1个正整数的异或
//ABCDE=perm[0]^perm[1]^perm[2]^...^perm[n]
int ABCDE=0;
for(int i=1;i<=n+1;++i)
ABCDE^=i;
//因为encoded[i]=perm[i+1]^perm[i],那么i从1开始,i+=2
//encoded[1]=perm[2]^perm[1],encoded[3]=perm[4]^perm[3],...,encoded[n-1]=perm[n]^perm[n-1]
//所以BCDE=perm[1]^perm[2]^...^perm[n]
//那么perm[0]=ABCDE^BCDE
int BCDE=0;
for(int i=1;i<n;i+=2)
BCDE^=encoded[i];
vector<int> perm(n+1);
perm[0]=ABCDE^BCDE;
for(int i=1;i<=n;++i)
perm[i]=perm[i-1]^encoded[i-1];
return perm;
}
};