题目
思路
该题目初看同1720. 解码异或后的数组 - 力扣(LeetCode) (leetcode-cn.com)类似,实际上,1720
中直接给出了原数组的第一个数,因此很简单,而本题的难点就在于如何求出原数组的第一个数。
根据题目描述,我们可以知道原数组是从1
到n
的正整数的排列,即原数组所有元素的异或结果为1 ^ 2 ... ^ n
(异或运算满足交换律)。另外,异或运算的特点x ^ x = 0
,如果我们能求出原数组中从第二个数到最后一个数的异或结果perm[1] ^ perm[2] ...^ perm[n-1]
,则能够求出原数组第一个数。
根据题目描述,有encode[i] = perm[i] ^ perm[i + 1]
,可以通过求encode[1] ^ encode[3] ^ encode[5] ... ^ encode[n-2]
来求perm[1] ^ perm[2] ...^ perm[n-1]
,因此我们就能够求出原数组的第一个数了。
上述求解方法需要保证
n-2
是奇数,因此当n为偶数(n-1)为奇数时,我们则无法通过encode
求出perm[1] ^ perm[2] ...^ perm[n-1]
。
代码
class Solution {
public:
vector<int> decode(vector<int>& encoded) {
int m = encoded.size() + 1;
int t = 0;
int s = 0;
for(int i=1; i<=m; i++) {
t ^= i;
}
for(int i=1; i<m-1; i+=2) {
s ^= encoded[i];
}
s ^= t;
vector<int> r(m);
r[0] = s;
for(int i=0;i<m-1;i++) {
s ^= encoded[i];
r[i+1] = s;
}
return r;
}
};