1734. 解码异或后的排列
思路:
利用异或规律的一道题。
首先明确题目对perm的定义,前n个正整数的排列,n为奇数。(因为没重视这句,想了好久都想不出,看了讨论里面说到这个才恍然大悟)
意思为perm为一个数组,里面放的是数字1-n,且数量为奇数。
又因为encoded[i]=perm[i-1]^perm[i]
我们举个n=5的例子
encoded[0]=perm[0]^perm[1]
encoded[1]=perm[1]^perm[2]
encoded[2]=perm[2]^perm[3]
encoded[3]=perm[3]^perm[4]
易发现对于 encoded[1] XOR encoded[3] 我们有perm[1]perm[2]perm[3]^perm[4]
根据异或的性质 m XOR n = a 有 a XOR m/n = n/m
那么 对数字 1-5 异或,那么我们就得到 pe = perm[0]perm[1]perm[2]perm[3]perm[4]
所以我们只要将pe 和encoded里面奇数下标的元素相与就能得到perm[0],那么根据上面异或性质和encoded和perm的关系,就能不断得到perm的元素。
代码:
class Solution {
public:
vector<int> decode(vector<int>& encoded) {
int pe=0;
int n=encoded.size();
vector<int> res;
for(int i=1;i<=n+1;++i){
pe ^= i; //数字1-n异或
}
for(int i=1;i<n;i=i+2){
pe ^= encoded[i]; //和奇数下标encoded异或
}
res.push_back(pe);
for(int i=0;i<n;++i){
pe = pe^encoded[i]; //通过encoded和perm关系不断复原perm
res.push_back(pe);
}
return res;
}
};