[leetcode_1720]1720. 解码异或后的数组

1720. 解码异或后的数组

https://leetcode-cn.com/problems/decode-xored-array/

难度简单49收藏分享切换为英文接收动态反馈

未知 整数数组 arrn 个非负整数组成。

经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3]

给你编码后的数组 encoded 和原数组 arr 的第一个元素 firstarr[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 的真值表如下:

pq
TTF
TFT
FTT
FFF

对于这道题,可使用异或运算, 异或运算有以下三个性质。

  1. 任何数和0 做异或运算,结果仍然是原来的数,即 p ⊕ 0 = p

  2. 任何数和其自身做异或运算,结果是 0,即 p ⊕ p = 0

  3. 异或运算满足交换律和结合律

交换律:

p ⊕ q = q ⊕ p

结合律:

p ⊕ (q ⊕ r) = (p ⊕ q) ⊕ r

补充第 四点
如果 p ⊕ q = x 那么一定有 p ⊕ x = qq ⊕ 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值