1720. 解码异或后的数组
https://leetcode-cn.com/problems/decode-xored-array/
难度简单49收藏分享切换为英文接收动态反馈
未知 整数数组 arr
由 n
个非负整数组成。
经编码后变为长度为 n - 1
的另一个整数数组 encoded
,其中 encoded[i] = arr[i] XOR arr[i + 1]
。例如,arr = [1,0,2,1]
经编码后得到 encoded = [1,2,3]
。
给你编码后的数组 encoded
和原数组 arr
的第一个元素 first
(arr[0]
)。
请解码返回原数组 arr
。可以证明答案存在并且是唯一的。
示例 1:
输入:encoded = [1,2,3], first = 1
输出:[1,0,2,1]
解释:若 arr = [1,0,2,1] ,那么 first = 1 且 encoded = [1 XOR 0, 0 XOR 2, 2 XOR 1] = [1,2,3]
示例 2:
输入:encoded = [6,2,7,3], first = 4
输出:[4,2,0,7,4]
提示:
2 <= n <= 104
encoded.length == n - 1
0 <= encoded[i] <= 105
0 <= first <= 105
解法1 异或运算
本题主要考察异或运算
小知识补充:
在数字逻辑中,逻辑算符异或(exclusive or
)是对两个运算元的一种逻辑分析类型,符号为 XOR 或 ⊕(编程语言中常用 ^
)。但与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真。
1.1 异或运算的表示形式
名称 | 符号 |
---|---|
数学符号 | ⊕ |
英文简称 | xor |
程序符号 | ^ |
1.2 异或运算的真值表
异或运算 p ⊕ q 的真值表如下:
p | q | ⊕ |
---|---|---|
T | T | F |
T | F | T |
F | T | T |
F | F | F |
对于这道题,可使用异或运算⊕
, 异或运算有以下三个性质。
-
任何数和0 做异或运算,结果仍然是原来的数,即
p ⊕ 0 = p
-
任何数和其自身做异或运算,结果是 0,即
p ⊕ p = 0
-
异或运算满足交换律和结合律
交换律:
p ⊕ q = q ⊕ p
结合律:
p ⊕ (q ⊕ r) = (p ⊕ q) ⊕ r
补充第 四点
如果 p ⊕ q = x
那么一定有 p ⊕ x = q
和 q ⊕ x = p
简单推导如下:
p ⊕ q = x
等式两边 同时异或p
p ⊕ p ⊕ q = p ⊕ x
由于 p ⊕ p = 0
因此
0 ⊕ q = p ⊕ x
由于 0 ⊕ q = q
q = p ⊕ x
由于题目中已经给出了arr 第一个元素,由于encoded[i] = arr[i] XOR arr[i + 1]
推出
arr[i + 1] = arr[i] ⊕ encoded[i]
只要把encoded[i] 和 arr[i] 进行 异或运算就是arr[i+1] 的值。
参考代码如下:
from typing import List
class Solution:
def decode(self, encoded: List[int], first: int) -> List[int]:
arr = [first]
for i, num in enumerate(encoded):
arr.append(arr[i] ^ num)
return arr