仅供自己学习记录
LeetCode刷题日记2021-5-10
题目描述
给你一个整数数组 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
题解思路
今天这道题目跟1486.数组异或操作有点类似 但是缺少的就是元素组的第一个位置的元素
https://blog.csdn.net/qq_39225746/article/details/116480348?spm=1001.2014.3001.5501
根据题目已知条件来求得原数组的第一个元素在分别与encode数组中的做异或操作就可以得到原来的数组了
注意
- 原数组为前 n 个正整数的排列
因此为了得到原数组 我们进行以下的计算
因为原数组是1到n个正整数排列
所有total=perm[1] ^ perm[2] ^ perm[3] ^ perm[4] ^ perm[5]…^perm[n]
接下来的问题就是如何去掉后面perm[1] ^ perm[2] ^ perm[3] ^ perm[4] ^ perm[5]…^perm[n]这部分
因为n为奇数故有
- encode[1]=perm[1] ^ perm[2]
- encode[3]=perm[3] ^ perm[4]
- encode[5]=perm[5] ^ perm[6]
- encode[7]=perm[7] ^ perm[8]
- …
故可以得出perm[1] ^ perm[2] ^ perm[3] ^ perm[4] ^ perm[5]…^perm[n]这部分
题解代码
n=len(encode)+1
reduce是求和函数redece(fucntion,范围)
total=reduce(xor,range(1,n+1)
odd=0
for i in range(1,n-1,2):
odd^=encode[i]
perm=[total^odd]
for i in range(n-1):
perm.append(perm[-1]^encod[i]
return perm