1 题目描述
题目连接:https://leetcode-cn.com/problems/decode-xored-permutation/
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。
它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。
给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。
示例 1:
输入:encoded = [3,1]
输出:[1,2,3]
解释:如果 perm = [1,2,3] ,那么 encoded = [1 XOR 2,2 XOR 3] = [3,1]
示例 2:
输入:encoded = [6,5,4,6]
输出:[2,4,1,5,3]
2 解题思路
- 异或问题是算法中常见的一类,异或运算是位运算的一种,相同得0,不同得1
- 本题的关键是确定出perm[0],然后根据perm[i+1] = perm[i] ^ encodedp[i]即可得到结果
- 题干中两个关键信息,一是perm是前 n 个正整数的排列(乱序),二是包含奇数个元素
- 根据第一关键信息,可以得到perm中所有数的异或结果,从1到n进行异或即可
- 根据第二关键信息,可以得到perm中除了perm[0]之外所有数的异或结果,原因是:
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]、encede[3]……包含了perm[1]、perm[2]、perm[3]、perm[4]…
- 根据【perm中所有数的异或结果】和【除了perm[0]之外所有数的异或结果】可得到perm[0]
3 代码/C++
class Solution {
public:
vector<int> decode(vector<int>& encoded) {
// 得到perm长度
int n = encoded.size()+1;
// 得到【perm中所有数的异或结果】
int total = 0;
for(int i=1; i<=n; i++){
total ^= i;
}
// 得到【除了perm[0]之外所有数的异或结果】
int odd = 0;
for (int i=1; i<n-1; i+=2){
odd ^= encoded[i];
}
vector<int> perm(n);
// 得到perm[0]
perm[0] = total ^ odd;
// 得到perm所有数
for (int i=0; i<n-1; i++){
perm[i+1] = perm[i]^encoded[i];
}
return perm;
}
};