我用java刷 leetcode 1734. 解码异或后的排列
Posted 深林无鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用java刷 leetcode 1734. 解码异或后的排列相关的知识,希望对你有一定的参考价值。
这里有leetcode题集分类整理!!!
(与 leetcode 1720 联动)
题目难度: 中等
题目描述:
给你一个整数数组 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 < 105
n 是奇数。
encoded.length == n - 1
解题:
关键数学公式:
1.如果a ^ b = c, 那么a ^ c = b, b ^ c = a
2. a ^ a = 0;
解题思路:
1.由题意可知,数组中为[1,encoded.length + 1],那么我们能算出从1到encoded.length + 1的异或结果total
2.由题意可知,encoded[i] = perm[i] ^ perm[i + 1],那么我们其实也就能根据这个公式算出perm除了某个位置之外的其他所有位置的异或和,在这里:
假设我们去求perm 0位置,那么我们只需要把perm原位置1到encoded.length + 1位置的全部异或了,就是除了0位置之外异或和,关键是这个该如何去计算?
其实只需要计算odd = encoded[1] ^ encoded[3] ^ encoded[5] ^ …… ^ encoded[encoded.length - 1],
因为根据题中公式能直接转换为odd = perm[1] ^ perm[2] ^ perm[3] ^ …… ^ perm[n - 1] ^ perm[n],
然后根据那个数学公式1,自己 ^ 自己 = 0,那么total ^ odd = perm[0];
3.求出一个位置后,用数学公式2去计算其他位置
AC:
class Solution {
public int[] decode(int[] encoded) {
int n = encoded.length;
int[] res = new int[n + 1];
int total = 1;
int odd = encoded[1];
for (int i = 2 ; i <= n + 1; i ++) total ^= i;
for (int i = 3 ; i < n ; i += 2) odd ^= encoded[i];
res[0] = total ^ odd;
for (int i = 1 ; i < n + 1 ; i ++) res[i] = res[i - 1] ^ encoded[i - 1];
return res;
}
}
以上是关于我用java刷 leetcode 1734. 解码异或后的排列的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1734 解码异或后的排列[数学] HERODING的LeetCode之路
LeetCode1734. 解码异或后的排列 / 剑指 Offer 36. 二叉搜索树与双向链表 / 剑指 Offer 37. 序列化二叉树