一、题目

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

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

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

点击查看原题

二、思路

由于给出的是已经进行加密数组,且不给第一个或最后一个数字,那么就需要自己去求解第一个或最后一个数字:
(这里有个很不容易理解的地方,“它是前 n 个正整数的排列”指就是1-n的数字的随机排列,包含了{1,2,…,n})
根据异或操作,对于任意数字num,有num^num=0,num^0=num,偶数个数字进行了异或操作,就可以消除该数字。可以利用这一特性来对其他元素进行消除。其实可以设定xor1ToN为perm[1]^perm[2]…perm[n],设定xor0ToN为perm[0]^perm[1]…perm[n],然后perm[0]=xor1ToN^xor0ToN。
使用encoded代替perm,可以得到:
xor1ToN=perm[1]^perm[2]…perm[n]=encoded[1]^encoded[3]…encoded[n]
xor0ToN=1^2^…^n

三、代码

  1. class Solution {
  2. public int[] decode(int[] encoded) {
  3. int[] ans = new int[encoded.length + 1];
  4. int xor1ToN = 0, xor0ToN = 0;
  5. for (int i = 1; i < encoded.length; i+=2) {
  6. xor1ToN ^= encoded[i];
  7. }
  8. for (int i = 1; i <= encoded.length+1; i++) {
  9. xor0ToN ^= i;
  10. }
  11. ans[0] = xor0ToN ^ xor1ToN;
  12. for (int i = 0; i < encoded.length; i++) {
  13. ans[i+1] = ans[i] ^ encoded[i];
  14. }
  15. return ans;
  16. }
  17. }