LeetCode:1486. 数组异或操作

1486. 数组异或操作

在这里插入图片描述
在这里插入图片描述

解法1:遍历异或

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        res = 0
        for i in range(0,n):
            res ^= start
            start += 2
        return res

解法2:找规律

在这里插入图片描述
由上图可推算出,

  • 当n%4==0时,res = n 只剩一个数字
  • 当n%4==1时,res = 1 剩两个数字
  • 当n%4==2时,res = n+1 三个数字异或正好与第四个相容
  • 当n%4==3时,res = 0 没有剩下数字

所以题目中的:

  • res = (start+2 * 0)^(start+2 * 1) ^(start+2 * 2) ^ … ^(start+2 * (n-2)) ^
    (start+2 * (n-1))
  • res>>1 = (start/2+0) ^ (start/2+1) ^ (start/2+2) ^ … ^
    (start/2+(n-2)) ^(start/2+(n-1))

所以令:

  • A = 1 ^ 2 ^ 3 ^ 4 ^ …^ (start/2-1)

  • B = 1 ^ 2 ^ 3 ^ 4 ^ …^ (start/2-1)+(start/2+0) ^ (start/2+1) ^
    (start/2+2) ^ … ^ (start/2+(n-2)) ^(start/2+(n-1)) = A ^ (res>>1)

得到:
res>>1 = A ^ B

然后解决最后一位是否为1的情况,异或,只有当start为奇数并且,异或数总个数为奇数才会出现1,否则就为0

1 if n%2 == 1 & start%2 == 1 else 0

代码

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        def solution(n):
            if n%4 == 0:
                return n
            elif n%4 == 1:
                return 1
            elif n%4 == 2:
                return n+1
            else:
                return 0
        
        A = solution((start>>1)-1)
        B = solution((start>>1)+n-1)
        return 2*(A^B) + (1 if n%2 == 1 & start%2 == 1 else 0)

简化代码

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        def solution(n):
            if n%4 == 0:
                return n
            elif n%4 == 1:
                return 1
            elif n%4 == 2:
                return n+1
            else:
                return 0

        return (solution((start>>1) - 1) ^ solution((start>>1) + n - 1)) << 1 | (n & start & 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南岸青栀*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值