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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 加持,客户体验更智能