LeetCode(16)解码异或后的排列(中等)

问题描述:

给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。

它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。

给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-xored-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码:

class Solution {
public int[] decode(int[] encoded) {
int n = encoded.length + 1;
int[] ans = new int[n];
// 求得除了 ans[n - 1] 的所有异或结果
int a = 0;
for (int i = 0; i < n - 1; i += 2) a ^= encoded[i];
// 求得 ans 的所有异或结果
int b = 0;
for (int i = 1; i <= n; i++) b ^= i;
// 求得 ans[n - 1] 后,从后往前做
ans[n - 1] = a ^ b;
for (int i = n - 2; i >= 0; i--) {
ans[i] = encoded[i] ^ ans[i + 1];
}
return ans;
}
}

值得注意的:

本题和前两天的解码异或后的数组相似 关键在于如何获取最后一位ans[n-1]的值(或者第一位ans[0])从而推出 整个数组的数值

如果我们把所有偶数位(或者奇数位全部异)就得到除最后一位(或者第一位)的全部异或结果 

由于原数组是前n项正整数的排序 我们将从1到n 全部异或 

再讲这两个结果异或得到ans[n-1] 或者ans[0]

最后在与encoded[n-1]结合就可以得到原数组perm[n-1]

 

posted @ 2021-05-17 21:20  ash98  阅读(45)  评论(0)    收藏  举报