📖解码异或后的排列
00 min
2024-7-15
2024-7-15
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. 计算从1到n的所有正整数的异或总和,记为total
  1. 遍历encoded数组,计算所有奇数位置上的元素的异或总和,记为odd
  1. 计算perm[0] = total ^ odd
  1. 通过perm[0]encoded数组,依次计算出perm数组中的其他元素。
 

代码

上一篇
找出最长的超赞子字符串
下一篇
不相交的线