LeetCode每日刷题-1734. 解码异或后的排列

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]

本题的思路需要参考异或的性质:

1.相同数值异或,结果为0
2.任意数值与0进行异或,结果为数值本身
3.异或本身满足交换律
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
1、a ⊕ a = 0
2、a ⊕ b = b ⊕ a
3、a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
4、d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
5、a ⊕ b ⊕ a = b
encoded[i] = perm[i] XOR perm[i + 1] 两边同时异或上perm[i] => encoded[i] XOR perm[i] = perm [i + 1] 
再求出第一个值。

代码:

/**
 * @param {number[]} encoded
 * @return {number[]}
 */
var decode = function(encoded) {
    let n = encoded.length + 1;
    let total = 0;
    let ol = 0;
    for(let i = 1;i <= n ;i++){
    total ^= i;
    }
    for(let i = 1;i < n-1 ;i += 2){
    ol ^= encoded[i];
    }
    const perm = new Array();
    perm[0] = total ^ ol;
    for(let i = 0 ;i < n -1;i++){
        perm[i + 1] = perm[i] ^ encoded[i];
    }
    return perm;
};

 

 

 (三个循环跑了3s居然还能击败100%

posted @ 2021-05-11 09:53  ❀Camelia  阅读(93)  评论(0)    收藏  举报