题目描述
题干:
给你一个整数数组 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]
题解思路
根据解码的思路根据encoded数组把perm数组求出,这道题是和另外一道题相关联,具体请看链接文章
https://www.cnblogs.com/bc-song/p/14737837.html
如果这道题只有一个encoded数组想要解出来就是天方夜谈,这里一定要仔细读题
题干里明确提到数组是前n个正整数排列,不管是否有序,关键是可以得到所有元素的异或值
我们想要解题最关键的因素就是在于找到perm数组数组中的任意一个值,这里我们有了总的
只需要根据encoded数组得到缺少一个元素的其他值的异或值就可以得到最终解
我们指导encoded的元素是每连续两位perm数组中异或得到的
这里我们把除了encoded[0]之外的每隔两个取一次异或这样就可以得到除了perm[0]所有的异或值了
正确代码
public int[] decode(int[] encoded) {
int permLenth = encoded.length + 1;
//计算前n个正整数的异或值
int total = 0;
for (int i = 1; i <= permLenth; i++) {
total ^= i;
}
//计算除了prem[0]的异或值
int odd = 0;
for (int i = 1; i < permLenth - 1; i += 2) {
odd ^= encoded[i];
}
//得到异或两个值得到perm[0]
int[] perm = new int[permLenth];
perm[0] = total ^ odd;
//从第一位开始计算原始数组
for (int i = 0; i < permLenth - 1; i++) {
perm[i + 1] = perm[i] ^ encoded[i];
}
return perm;
}
总结
位运算的题目果真都是知道公式找规律,细心读题都是没有问题的
这道题好像提交率不高也许是大佬们都不屑于去做或者就是没有看到关键信息而劝退的原因吧
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见