题目描述

一个黑板上写着一个非负整数数组 nums[i] 。小红和小明轮流从黑板上擦掉一个数字,小红先手。如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败。 (另外,如果只剩一个数字,按位异或运算得到它本身;如果无数字剩余,按位异或运算结果为 0。)

换种说法就是,轮到某个玩家时,如果当前黑板上所有数字按位异或运算结果等于 0,这个玩家获胜。

假设两个玩家每步都使用最优解,当且仅当小红获胜时返回 true。

示例1

        输入:
nums = [1, 1, 2]
输出:
false
解释:
小红有两个选择: 擦掉数字 1 或 2。
如果擦掉 1, 数组变成 [1, 2]。剩余数字按位异或得到 1 XOR 2 = 3。那么小明可以擦掉任意数字,因为小红会成为擦掉最后一个数字的人,她总是会输。
如果小红擦掉 2,那么数组变成[1, 1]。剩余数字按位异或得到 1 XOR 1 = 0。小红仍然会输掉游戏。

提示

  • 1 <= N <= 1000
  • 0 <= nums[i] <= 2^16

题解

小红获胜的条件就是,某一步轮到她的时候,所有数异或等于 0 。

而反过来,她输的条件就是,面对 n 个数,无论她选哪个数,去掉这个数之后剩下的数的异或都等于 0 。

假设 n 个数的异或为 S ,也就是令:

因为两个相同的数的异或为 0 ,所以去掉任意一个数 之后的异或为 ,所以 ,也就是所有的数都相等。

此时如果 n 是偶数,那么 n 个数的异或必为 0 ,和小红必输矛盾了,所以 n 一定要是奇数。

也就是说,如果 n 是偶数,那么小红总有办法去掉一个数,然后使得剩下的数异或不为 0 ,这时小明就没办法获胜。而不管小明擦除哪个数,轮到小红的时候个数又变成了偶数,小红就可以继续不输擦除下去。直到最后,一定是小红面对着空的数集,最终获胜。

而 n 是奇数的时候,无论小红选什么数,小明面对的都是偶数个数,那么小明必胜。

综上,n 是偶数小红必胜,或者刚开始 n 个数异或就是 0 ,这样不管奇偶,小红都能获胜。

代码

c++

        class Solution {public:bool xorGame(vector<int>& nums) {if (!(nums.size()&1)) return true;int x = 0;for (auto i : nums) x ^= i;return !x;}
};

python

        from functools import reduceclass Solution:def xorGame(self, nums: List[int]) -> bool:return (len(nums)&1) == 0 or reduce(operator.xor, nums) == 0

后记

官方题解是这么说的:如果 n 是偶数,那么小红有很大概率获胜,因为如果游戏能够一直进行下去,小明将会是擦除最后一个数的人,轮到小红时黑板上已经没有数,小红获胜。然后再推测 n 是偶数情况下的必胜条件,但是这样带有一点先猜后验证的成分。

所以我的推测方法直接从必胜条件出发,推测出 n 是偶数,这样过渡自然,更符合思考的路线。

每日算法系列【LeetCode 810】黑板异或游戏相关推荐

  1. 【LeetCode每日一题】810. 黑板异或游戏

    [LeetCode每日一题]810. 黑板异或游戏 题目: 黑板上写着一个非负整数数组 nums[i] .Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手.如果擦除一个数字后,剩余的 ...

  2. LeetCode 810. 黑板异或游戏(博弈推理)

    1. 题目 一个黑板上写着一个非负整数数组 nums[i] . 小红和小明轮流从黑板上擦掉一个数字,小红先手. 如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败 ...

  3. leetcode 810. 黑板异或游戏

    黑板上写着一个非负整数数组 nums[i] .Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手.如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失 ...

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

    1 题目描述 2 解题思路 ·根据游戏规则,轮到某个玩家时,如果当前黑板上所有数字异或结果等于 0,则当前玩家获胜.由于 Alice 是先手,因此如果初始时黑板上所有数字异或结果等于 0,则Alice ...

  5. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  6. 2021-05-22 黑板异或游戏

    题目: 题目地址: https://leetcode-cn.com/problems/chalkboard-xor-game/submissions/ 黑板异或游戏 黑板上写着一个非负整数数组 num ...

  7. < 每日算法 - Javascript解析:经典弹珠游戏 >

    每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容

  8. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  9. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  10. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

最新文章

  1. linux mysql 无法识别,Linux下MySQL 5.7.23无法远程连接解决方案
  2. shaderlab学习一
  3. bzoj 3033 太鼓达人——欧拉图搜索
  4. python默认安装地址_python多版本下设置python3为默认的方法
  5. 同步器 java_您可能不知道的五个高级Java同步器
  6. android 开发50个技巧面向切面编程思想
  7. c语言中scanf的用法
  8. 电路交换,分组交换,报文交换
  9. 实现简单的滑块验证代码案例
  10. IE9打开的html文件打印不了,IE9无法查看打印预览的2个解决方法
  11. Worm.Win32.DownLoad.gew病毒清除记
  12. cadence SPB17.4 - allegro - Artwork will be rounded down
  13. Axure RP9 入门1——【安装+汉化+界面初识】
  14. 【题目】pyCharm 专业版 和 社区版的区别以及如何查看其版本
  15. java使用geotools读取shp文件
  16. 用Xposed框架抓取微信朋友圈数据
  17. Android studio编译错误
  18. 保护元件、设备人身安全防护(四川防电盾)
  19. elasticsearch client依赖包下载方法
  20. uC/OS-II实时操作系统的数据结构

热门文章

  1. asp.net(C#)网站发布后 Global.asax 里 Application_Error 不执行的问题
  2. struts2之chain的使用
  3. linux 中ifconfig命令 结果解释
  4. 【转贴CSDN】关于DataGrid的精华
  5. Altium Designer(四):敷铜设置
  6. Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present(LIS)
  7. 【Android Studio安装部署系列】三十一、从Android studio3.0.0升级到Android studio3.0.1
  8. 使用Global.asax实现ASP.Net的URL重写
  9. Pytorch中的强化学习
  10. sql2012,返回数据多时不走索引