文巾解题 810. 黑板异或游戏
Posted 刘文巾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 810. 黑板异或游戏相关的知识,希望对你有一定的参考价值。
1 题目描述
2 解题思路
·根据游戏规则,轮到某个玩家时,如果当前黑板上所有数字异或结果等于 0,则当前玩家获胜。由于 Alice 是先手,因此如果初始时黑板上所有数字异或结果等于 0,则Alice 获胜。
如果初始时黑板上所有数字异或结果不等于 0:
由于两人交替擦除数字,且每次都恰好擦掉一个数字,因此对于这两人中的任意一人,其每次在擦除数字前,黑板上剩余数字的个数的奇偶性一定都是相同的。
我们从数组nums 长度的奇偶性来讨论,看看奇偶性和Alice的输赢有没有关系。
Alice 面临失败的状态只有一种情况,即无论擦掉哪一个数字,剩余所有数字的异或结果都等于 0,下面证明这是不可能的
根据上述计算,可以得到 S=0,与这时候的假设 S≠0 矛盾
因此当数组的长度是偶数时,先手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++ 原来是道数学推理题?