LeetCode每日一题————1734. 解码异或后的排列

题目描述

给你一个整数数组 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

 

标签:位运算

 

解题技巧

这道题跟之前的一道题1720. 解码异或后的数组非常类似,只不过之前的给了原始数组的第一个数,就可以正向直接求解,不过这一题是没有给出原始数组的第一个数的,所以我们就需要想方设法求出第一个数来。经观察异或运算的一些特性和看官方题解,发现如果要求第一个数的话,我们可以先求出整个原数组的n个数的异或结果total,再求出除第一个数之外的后n-1个数的异或结果odd,即可通过total^odd得到第一个数。那么显然前一个total是很容易求出来的,因为题目已经告诉我们原数组perm是由1-n个正整数排列而成的,而又因为异或是不区分先后顺序的,我们只要从1异或到n即可将total求出;然后就是怎么求除第一个数之外的后面的所有数的异或结果了。又因为题目已经明确告诉了我们原数组是如何编码成encoded的

 encoded[i] = perm[i] + perm[i + 1],那么可以发现perm[1] ^ perm[2] ^ perm[3] ....^ perm[n - 1] = encoded[1] ^ encoded[3] ^ encoded[5] ... ^ encoded[encoded.length - 1](所有下标为奇数),这样一来我们就可以求出odd了进而得出原数组的第一个数了,那么之后的运算就跟1720. 解码异或后的数组一样,这里就不再讲解了。

AC代码

复制代码
 1 class Solution {
 2     public int[] decode(int[] encoded) {
 3         int n = encoded.length + 1;
 4         int total = 0;
 5         // 将整数数组perm所有元素异或得到total
 6         for (int i = 1; i <= n; i++) {
 7             total ^= i;
 8         }
 9 
10         int odd = 0;
11         // 求除第一个数之外的后面所有数的异或结果
12         // 根据题意分析可知:perm数组后n-1个数异或的结果等于encode数组中下标为奇数的所有数的异或结果
13         for (int i = 1; i < encoded.length; i+=2) {
14             odd ^= encoded[i];
15         }
16 
17         int[] f = new int[n];
18         // 通过前面求出来的前n个数的异或结果和除第一个数之外的后n-1个数的异或结果可以求出第一个数
19         f[0] = total ^ odd;
20         for (int i = 1; i < n; i++) {
21             f[i] = f[i - 1] ^ encoded[i - 1];
22         }
23 
24         return f;
25     }
26 }
复制代码

leetcode

posted @   没有你哪有我  阅读(165)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示