文章目录
1. 题目
给你一个整数数组 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]
提示:
3 <= n < 10^5
n 是奇数。
encoded.length == n - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-xored-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
-
首先知道, a 1 ⊕ a 2 . . . ⊕ a n = 1 ⊕ 2... ⊕ n = C 1 a_1 \oplus a_2...\oplus a_n = 1\oplus2... \oplus n = C_1 a1⊕a2...⊕an=1⊕2...⊕n=C1,式子 1
-
a 1 ⊕ a 2 = e 1 , a 2 ⊕ a 3 = e 2 , . . . , a n − 1 ⊕ a n = e n − 1 a_1\oplus a_2 = e_1, a_2\oplus a_3 = e_2,...,a_{n-1}\oplus a_n = e_{n-1} a1⊕a2=e1,a2⊕a3=e2,...,an−1⊕an=en−1,偶数个式子
-
上面式子求前缀异或值有:
a 1 ⊕ a 2 = e 1 a_1\oplus a_2 = e_1 a1⊕a2=e1
a 1 ⊕ a 3 = e 1 ⊕ e 2 a_1\oplus a_3 = e_1\oplus e_2 a1⊕a3=e1⊕e2
…
a 1 ⊕ a n = e 1 ⊕ e 2 . . . ⊕ e n − 1 a_1\oplus a_n = e_1\oplus e_2...\oplus e_{n-1} a1⊕an=e1⊕e2...⊕en−1 偶数个式子
全部求异或得:
a 2 ⊕ a 3 . . . ⊕ a n = C 2 a_2 \oplus a_3...\oplus a_n = C_2 a2⊕a3...⊕an=C2,式子2 -
式子 1 和 2 异或得: a 1 = C 1 ⊕ C 2 a_1 = C_1 \oplus C_2 a1=C1⊕C2,然后根据
encoded
就得到了其余的 a i a_i ai
class Solution {
public:
vector<int> decode(vector<int>& encoded) {
int n = encoded.size();
vector<int> ans(n+1);
vector<int> preEnc(encoded);
for(int i = 1; i < encoded.size(); ++i)
preEnc[i] ^= preEnc[i-1];
int a2_an = 0;
for(int i = 0; i < preEnc.size(); ++i)
a2_an ^= preEnc[i];
int all = 0;
for(int i = 1; i <= n+1; ++i)
all ^= i;
ans[0] = all^a2_an;
for(int i = 1; i <= n; ++i)
ans[i] = ans[i-1]^encoded[i-1];
return ans;
}
};
160 ms 98.8 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!