LeetCode题解——解码异或后的排列
- 题目介绍
- 解题思路
这一题的思路和之前的这一题很像,唯一区别就是没有告诉首个元素的值,那这一题的核心思路就是求出perm[0]
LeetCode题解——解码异或后的数组_yxh_1_的博客-优快云博客
- 已知一点a ^ a = 1
- 题目中说了perm是由前n个正整数组成的,那么可以有下面一点结论total = 1^2^3……^n = perm[0]^perm[1]^perm[2]^……perm[n-1]
- encoded[0] = perm[0]^perm[1],encoded[1] = perm[1]^perm[2],encoded[n-2] = perm[n-2]^perm[n-1].
- 将第二点进行推导,a^a=1,那将total = 1^2^3……^n = perm[0]^perm[1]^perm[2]^……perm[n-1]左右各异或上perm[1]^perm[2]^……perm[n-1],
- 可以得出一个表达式perm[0] = total^perm[1]^perm[2]^……perm[n-1]
- total的值已经有了,现在就是求出perm[1]^perm[2]^……perm[n-1],根据第三点的表达式可以知道total2 = perm[1]^perm[2]^……perm[n-1] = encoded[1]^encoded[2]^……encoded[n-2]
- 最后的结论就是perm[0] = total^total2,注意里面的n是perm长度
- 代码示例
class Solution {
public:
vector<int> decode(vector<int>& encoded) {
int len = encoded.size();
int total1 = 1;
int total2 = encoded[1];
vector<int> perm(len+1,0);
for(int i = 2;i<=len+1;i++) {
total1 ^=i;
}
for(int i = 3;i<=len;i += 2) {
total2 ^= encoded[i];
}
perm[0] = total1 ^ total2;
for(int i = 1;i<=len;i++) {
perm[i] = perm[i-1] ^ encoded[i-1];
}
return perm;
}
};