前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1734. 解码异或后的排列(位运算)

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

作者头像
Michael阿明
发布2021-02-19 12:51:47
3590
发布2021-02-19 12:51:47
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

260 / 1826,前14.2%

在这里插入图片描述
在这里插入图片描述

912 / 8568,前10.6%

1. 题目

给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数

它被加密成另一个长度为 n - 1 的整数数组 encoded , 满足 encoded[i] = perm[i] XOR perm[i + 1] 。 比方说,如果 perm = [1,3,2] , 那么 encoded = [2,1] 。

给你 encoded 数组,请你返回原始数组 perm 。 题目保证答案存在且唯一。

代码语言:javascript
复制
示例 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​
代码语言:javascript
复制
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++


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档