type
status
date
slug
summary
tags
category
icon
password
题目:解码异或后的排列
给你一个整数数组
perm
,它是前 n
个正整数的排列,且 n
是个 奇数 。它被加密成另一个长度为
n - 1
的整数数组 encoded
,满足 encoded[i] = perm[i] XOR perm[i + 1]
。比方说,如果 perm = [1,3,2]
,那么 encoded = [2,1]
。给你
encoded
数组,请你返回原始数组 perm
。题目保证答案存在且唯一。示例 1:
示例 2:
提示:
3 <= n < 105
n
是奇数。
encoded.length == n - 1
题解
分析
要解决这个问题,我们可以利用异或运算的性质。异或运算有两个关键性质:自反性(
a ^ a = 0
)和交换律(a ^ b = b ^ a
)。由于perm
是前n
个正整数的排列,我们可以先求出这n
个正整数的异或总和,记为total
。然后,我们知道encoded
数组是由perm
数组中相邻两个元素异或得到的,因此我们可以通过encoded
数组求出perm
数组中所有奇数位置上的元素的异或总和,记为odd
。由于
n
是奇数,perm
数组中奇数位置和偶数位置的元素数量不同,具体来说,奇数位置的元素比偶数位置的元素多一个。因此,我们可以通过total ^ odd
得到perm
数组中第一个元素的值(即perm[0]
),因为total
是所有元素的异或总和,odd
是除了perm[0]
以外所有奇数位置元素的异或总和,所以total ^ odd
就等于perm[0]
。有了
perm[0]
的值后,我们就可以通过encoded
数组和perm[0]
依次求出perm
数组中的其他元素。以下是具体的实现步骤:
- 计算从1到
n
的所有正整数的异或总和,记为total
。
- 遍历
encoded
数组,计算所有奇数位置上的元素的异或总和,记为odd
。
- 计算
perm[0] = total ^ odd
。
- 通过
perm[0]
和encoded
数组,依次计算出perm
数组中的其他元素。
代码
- Author:Zinphy
- URL:https://zouysay.cn/article/b690ed80-b479-49d2-85bb-7253988d8790
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!