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;
    }
};
posted @ 2021-05-11 17:34  Mrsdwang  阅读(34)  评论(0编辑  收藏  举报