leetcode--异或问题

在这里插入图片描述

1486. 数组异或操作
给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。 请返回 nums 中所有元素按位异或(XOR)后得到的结果。
在这里插入图片描述

810. 黑板异或游戏
黑板上写着一个非负整数数组 nums[i] 。Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手。如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败。 (另外,如果只剩一个数字,按位异或运算得到它本身;如果无数字剩余,按位异或运算结果为 0。)换种说法就是,轮到某个玩家时,如果当前黑板上所有数字按位异或运算结果等于 0,这个玩家获胜。假设两个玩家每步都使用最优解,当且仅当 Alice 获胜时返回 true。

数学推理
1.如果当前先手这个人一开始面对局面是异或和为0,那这个人已经赢了
2.反之,如果当前先手的人看到局面不是异或和为0,且列表元素个数为偶数k,那当前这个先手的人可以选择擦掉k个数其中一个,如果不论擦掉哪一个,剩下数值的异或和都是0,那这个人面对的就是一个必输局,但是这个是不可能的
3.假设S = nums[0] ^ nums[1] ^ … ^ nums[k-1], 前面说了S != 0 要不然当前这个先手的人已经赢了,
4.如果当前是一个必输局,那S^ nums[0] = 0, S^ nums[1] = 0, … S^nums[k-1] =0 必然全成立
5.把他们全部异或在一起等于S异或k+1次,k是偶数,那k+1是奇数,一个非0值自己异或自己奇数次,不可能是0,所以如果当前先手这个人面对的是一个总个数是偶数的数组,但是异或和不是0,那这个局非必输,当前这个先手的人一定可以擦掉一个数,暂时保证自己不马上输掉,然后留给对手的局是总个数是奇数,异或和不为0的一个局,那对手不管擦掉的是谁,如果擦掉之后异或和为0了,那当前先手这个人就获胜了,如果擦掉之后异或和不为0,那又重复了问题,当前先手这个人又拿到了一个非必输局,如此循环下去,当前先手这个人永远立于不败之地,最后肯定是赢家
相反的,当前先手这个人如果面对了总个数是奇数,但是异或和不为0的局,那永远会把非必输局留给对手,题目又假设两个人都用最佳策略,那这个先手的人必输
那最后结论就是当前异或和为0或者总个数是偶数个,面对这个局面的人必赢,反之异或和不为0,总个数是奇数,必输,这个推理有点绕

1310. 子数组异或查询
有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor … xor arr[Ri])作为本次查询的结果。
并返回一个包含给定查询 queries 所有结果的数组。
方法一:前缀和
我们用数组 pre 表示数组 arr 的「前缀异或和」,即
pre[i] = arr[0] ^ arr[1] ^ … ^ arr[i - 1]
其中 ^ 表示异或(xor)操作。这样以来,当我们要计算 arr[Li] 到 arr[Ri] 的异或值时,我们可以通过

pre[Li] ^ pre[Ri + 1] = (arr[0] ^ ... ^ arr[Li - 1]) ^ (arr[0] ^ ... ^ arr[Ri])
                      = (arr[0] ^ ... ^ arr[Li - 1]) ^ (arr[0] ^ ... ^ arr[Li - 1]) ^ (arr[Li] ^ ... ^ arr[Ri]) (异或运算的结合律)
                      = 0 ^ (arr[Li] ^ ... ^ arr[Ri]) (异或运算的逆运算,即 a ^ a = 0= arr[Li] ^ ... ^ arr[Ri]

2 模拟直接求解

1720. 解码异或后的数组
未知 整数数组 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 。可以证明答案存在并且是唯一的。

1734. 解码异或后的排列
给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。
它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。
给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。

在这里插入图片描述

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值