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%

浙公网安备 33010602011771号