题意:
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。
它被加密成另一个长度为 n - 1 的整数数组 encoded ,
满足 encoded[i] = perm[i] XOR perm[i + 1] 。
比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。
给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。
数据范围:
3 <= n < 1e5
n 是奇数。
encoded.length == n - 1
解法:
题目的特殊条件:
perm[]的长度n是奇数,且序列是排列.
那么:
encoded[]的长度是偶数,
encoded[0]=perm[0]^perm[1],
encoded[2]=perm[2]^perm[3],
....
encoded[n-3]=perm[n-3]^perm[n-2].
因此:
encoded[0]^encoded[2]^...encoded[n-3]=perm[0]^perm[1]^...perm[n-2],
设上式的结果为p
令temp=1^2^3....^n,那么temp^p=perm[n-1].
又因为encoded[n-2]=perm[n-2]^perm[n-1],
encoded[n-2]已知,perm[n-1]已知,那么可以退出perm[n-2],
同理可递推出perm[n-3],perm[n-4]...perm[0].
答案就出来了
code:
class Solution {
public:
vector<int> decode(vector<int>& a) {
int n=a.size();
vector<int>ans(n+1);
int temp=0;
for(int i=1;i<=n+1;i++)temp^=i;
for(int i=0;i<n;i+=2){
temp^=a[i];
}
ans[n]=temp;
for(int i=n-1;i>=0;i--){
ans[i]=ans[i+1]^a[i];
}
return ans;
}
};