LeetCode 5647. 解码异或后的排列(位运算)

文章目录

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阿明),一起加油、一起学习进步!
LeetCode 5647. 解码异或后的排列(位运算)

上一篇:info sharp Are you trying to install as a root or sudo user? Try again with the --unsafe-perm flag


下一篇:odoo权限