文巾解题 810. 黑板异或游戏

Posted 刘文巾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 810. 黑板异或游戏相关的知识,希望对你有一定的参考价值。

1 题目描述

2 解题思路

·根据游戏规则,轮到某个玩家时,如果当前黑板上所有数字异或结果等于 0,则当前玩家获胜。由于 Alice 是先手,因此如果初始时黑板上所有数字异或结果等于 0,则Alice 获胜。

 

如果初始时黑板上所有数字异或结果不等于 0:

由于两人交替擦除数字,且每次都恰好擦掉一个数字,因此对于这两人中的任意一人,其每次在擦除数字前,黑板上剩余数字的个数的奇偶性一定都是相同的。

我们从数组nums 长度的奇偶性来讨论,看看奇偶性和Alice的输赢有没有关系。

Alice 面临失败的状态只有一种情况,即无论擦掉哪一个数字,剩余所有数字的异或结果都等于 0,下面证明这是不可能的

根据上述计算,可以得到 S=0,与这时候的假设 S0 矛盾

 

因此当数组的长度是偶数时,先手Alice 总能找到一个数字,在擦掉这个数字之后剩余的所有数字异或结果不等于 0

 

在 Alice 擦掉这个数字后,黑板上剩下奇数个数字,无论Bob 擦掉哪个数字,留给Alice 的一定是偶数个数字,此时Alice 要么获胜,要么仍可以找到一个数字,在擦掉这个数字之后剩余的所有数字异或结果不等于0。因此当Alice先手,且数组的长度是偶数的时候,Alice每轮至少不败。当黑板上数字异或之和为0,或者没有数的时候,Alice赢。

同理可得,当数组的长度是奇数时,Alice 在擦掉一个数字之后,留给 Bob 的一定是黑板上剩下偶数个数字,因此Bob 每轮至少不败。当黑板上数字异或之和为0,或者没有数的时候,Bob赢。

 

综上所述,当且仅当以下两个条件至少满足一个时,Alice 必胜:

数组 nums 的全部元素的异或结果等于 0;

数组nums 的长度是偶数。

 

分析完之后,代码就很简单了:

class Solution:
    def xorGame(self, nums: List[int]) -> bool:
        if(len(nums)%2==0):
            return True
        sum=0
        for i in nums:
            sum=sum^i
        if(sum==0):
            return True
        return False

 

以上是关于文巾解题 810. 黑板异或游戏的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 810 黑板异或游戏[数学 异或] HERODING的LeetCode之路

[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?

[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?

[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?

[LeetCode] 810. 黑板异或游戏 Java/C++ 原来是道数学推理题?

LeetCode篇:810 黑板异或游戏(JavaScript版)