文巾解题 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

UQI-LIUWJ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值