LeetCode:1486. 数组异或操作

Posted 南岸青栀*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

以上是关于LeetCode:1486. 数组异或操作的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode1486. 数组异或操作(Java/c++ 暴力模拟)

LeetCode1486. 数组异或操作

LeetCode 1486 数组异或操作[位运算 数学] HERODING的LeetCode之路

python描述 LeetCode 1486. 数组异或操作

LeetCode 1486.数组异或操作

我用java刷 leetcode 1486. 数组异或操作