码迷,mamicode.com
首页 > 其他好文 > 详细

1734. 解码异或后的排列

时间:2021-05-24 05:45:47      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:back   vector   奇数   turn   decode   ack   一个   push   amp   

思路:
利用异或规律的一道题。
首先明确题目对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;
    }
};

1734. 解码异或后的排列

标签:back   vector   奇数   turn   decode   ack   一个   push   amp   

原文地址:https://www.cnblogs.com/Mrsdwang/p/14756517.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!