ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-24 10:34:21  阅读:189  来源: 互联网

标签:... int perm 异或 a2 encoded oplus 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阿明),一起加油、一起学习进步!
Michael阿明

标签:...,int,perm,异或,a2,encoded,oplus,LeetCode,5647
来源: https://blog.csdn.net/qq_21201267/article/details/113068427

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有