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; } };