Leetcode每日刷题【中】--Day 5

1720. 解码异或后的数组

这是一道位运算的简单题,后边有此题升级版的中等题目

其实,知道一些基本知识后,此题是很简单的。

  • 异或满足交换律
  • 异或满足:a ^ b = c 可知 a ^ c = b
  • a ^ 0 = a
  • a ^ a = 0

这道题给出了加密后的数组,同时也给出了原数组的第一个值,利用上边的第二个知识,问题就迎刃而解了。

将加密数组的第一个元素和原数组的第一个元素异或就得到原数组第二个元素…根据题目,就这样推下去答案就出来了。

class Solution:
    def decode(self, encoded: List[int], first: int) -> List[int]:
        ans = [first,]
        for i in encoded:
            ans.append(ans[-1]^i)
        return ans
1734. 解码异或后的排列

这道题主要问题集中在如何寻找第一个值,一旦找出来,其实和上面的题没差了。确实偷瞄到了题解,还看得懵了一段时间。借此以简单的形式记录一下
如 果 原 数 组 a n s = [ a , b , c , d , e , f ] ( n 偶 数 ) 则 e n c o d e d = [ a b , b c , c d , d e , e f ]      a b 表 示 a 与 b 异 或 运 算 我 们 能 够 知 道 得 是 原 数 组 是 不 大 于 n 的 正 整 数 排 列 , n 是 奇 数 , 这 给 得 神 奇 。 偷 看 了 一 下 题 解 , 利 用 一 种 整 体 的 思 想 去 反 求 , 第 一 个 元 素 需 要 的 就 是 奇 数 。 a n s 内 部 异 或 运 算 , 得 到 的 是 a b c d e f , 在 已 知 的 数 组 中 没 有 单 独 的 f 让 我 们 能 够 反 求 a . a = a b c d e f 异 或 b c 异 或 d e 异 或 f , 这 里 多 一 个 f 为 什 么 这 么 说 ? ⇒ 在 e n c o d e d 中 能 够 找 到 的 是 两 两 异 或 的 结 果 , 能 从 其 中 下 标 为 奇 数 的 元 素 提 出 来 , 反 求 得 a , 但 是 没 有 单 独 的 f 。 如果原数组 ans = [a, b, c, d, e, f](n偶数) \\则encoded = [ab,bc,cd,de,ef]\ \ \ \ ab表示a与b异或运算\\我们能够知道得是原数组是不大于n的正整数排列,n是奇数,这给得神奇。\\偷看了一下题解,利用一种整体的思想去反求,第一个元素需要的就是奇数。\\ans内部异或运算,得到的是abcdef,在已知的数组中没有单独的f让我们能够反求a.\\a = abcdef异或bc异或de异或f,这里多一个f\\为什么这么说?\Rightarrow 在encoded中能够找到的是两两异或的结果,能从其中下标为奇数的元素提出来,反求得a,但是没有单独的f。 ans=[a,b,c,d,e,f](n)encoded=[ab,bc,cd,de,ef]    ababn,n,ansabcdeffa.a=abcdefbcdef,fencodedaf

class Solution:
    def decode(self, encoded: List[int]) -> List[int]:
        m = len(encoded)
        n = reduce(lambda x,y: x^y,range(1,m+2))  # 求abcde
        to_find = 0
        for x in range(m):
            if x % 2:
                to_find ^= encoded[x]  # 求bcde
        first = n ^ to_find  # 求a
     
        ans = [first]
        for i in encoded:  # 同第一题
            ans.append(ans[-1]^i)
        return ans
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JamePrin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值