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!