LeetCode刷题:解码异或后的排列

 

 

已知条件:
给定两个数组A[n],B[n-1],n为奇数,注意这里n说的是数组长度,底下的n是数组索引
A[n]中数组元素为n的正整数排列,顺序不一定
约定A[i]^A[i+1]=B[i]
异或操作的特性:
0^n=n^0=n
n^n=0


因为A[i]^A[i+1]=B[i],所以可得(A[0]^A[1])^(A[1]^A[2])^(A[2]^A[3])........(A[n-2]^A[n-1])^(A[n-1]^A[n])=B[0]^B[1]^B[2]....^B[n-1]
根据异或特性去掉些多余的东西可得公式
A[0]^A[n]=B[0]^B[1]^B[2]....^B[n-1]

那下一步可得
(A[0]^A[1])^(A[0]^A[2])^..........(A[0]^A[n-1])^(A[0]^A[n])=(B[0])^(B[0]^B[1])^(B[0]^B[1]^B[2])^......^(B[0]^B[1]^B[2]....^B[n-1])

由于A数组长度为奇数,B数组长度为偶数,所以左侧A[0]有偶数个,右侧B[0]有偶数个,B[1]有奇数个,以此类推,B[n-1]中n-1为偶数则B[n-1]有偶数个,为奇数则B[n-1]有奇数个
根据异或特性去掉多余可得
A[1]^A[2]^....^A[n]=B[1]^B[3]...^B[奇数末尾]

又因为A[n]中数组元素为n的正整数排列
A[0]^A[1]^A[2]^....^A[n]=1^2^...n+1
A[0]=(1^2^...n+1)^(A[1]^A[2]^....^A[n])
A[0]=(1^2^...n+1)^(B[1]^B[3]...^B[奇数末尾])

知道A[0],已知B[n]的数组元素,这时候题目就很简单了

借用一下优秀代码演示一下

class Solution {
public:
    vector<int> decode(vector<int>& encoded) {
        // 前n个整数的排列这个条件,我的妈
        int sum = 0;
        for(int i = 1; i <= encoded.size() + 1; i ++)
            sum ^= i;
        for(int i = 1; i < encoded.size(); i += 2)
            sum ^= encoded[i];
        // 此时sum就是perm[0]
        vector<int> ans(encoded.size()+1);
        ans[0] = sum;
        for(int i = 1; i < ans.size(); i ++)
            ans[i] = ans[i-1] ^ encoded[i-1];
        return ans;
    }
};

 

posted @ 2021-05-11 16:43  Suarezz  阅读(74)  评论(0编辑  收藏  举报