We are given non-negative integers nums[i] which are written on a chalkboard.  Alice and Bob take turns erasing exactly one number from the chalkboard, with Alice starting first.  If erasing a number causes the bitwise XOR of all the elements of the chalkboard to become 0, then that player loses.  (Also, we'll say the bitwise XOR of one element is that element itself, and the bitwise XOR of no elements is 0.)

Also, if any player starts their turn with the bitwise XOR of all the elements of the chalkboard equal to 0, then that player wins.

Return True if and only if Alice wins the game, assuming both players play optimally.

Example:
Input: nums = [1, 1, 2]
Output: false
Explanation:
Alice has two choices: erase 1 or erase 2.
If she erases 1, the nums array becomes [1, 2]. The bitwise XOR of all the elements of the chalkboard is 1 XOR 2 = 3. Now Bob can remove any element he wants, because Alice will be the one to erase the last element and she will lose.
If Alice erases 2 first, now nums becomes [1, 1]. The bitwise XOR of all the elements of the chalkboard is 1 XOR 1 = 0. Alice will lose.

Notes:

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

这道题介绍了一种亦或游戏,写在黑板上,(黑板一脸懵逼,跟我有个毛关系)。爱丽丝和鲍勃两个人轮流擦除一个数字,如果剩下的数字亦或值为0的话,那么当前选手就输了。反过来也可以这么说,如果某一个选手开始游戏时,当前数字的亦或值为0了,那么直接就赢了。现在给了我们一个数组,问先手的爱丽丝能否获胜。那么其实这道题是一道有技巧的题,并不是让我们按照游戏规则那样去遍历所有的情况,有海量的运算。这题有点像之前那道Nim Game,重要的是技巧!技巧!技巧!重要的事情说三遍~但我等凡夫俗子如何看的出技巧啊,看不出技巧只能看Discuss了,博主也没看出来。但实际上这道题的解法可以非常的简单,两三行就搞定了。辣么开始讲解吧:首先根据题目的描述,我们知道了某个选手在开始移除数字之前,如果数组的亦或值为0的话,选手直接获胜,那么先手爱丽丝在开始开始之前也应该检查一遍数组的亦或值,如果是0的话,直接获胜。我们再来分析亦或值不为0的情况,既然不为0,那么亦或值肯定是有一个值的,我们假设其是x。下面就是本题的精髓了,是要考虑数组个数的奇偶情况(尼玛谁能想到!),这个数组个数一旦是偶数的话,就大有文章了,现在数字个数是偶数,且亦或值不为0,说明数组中的数字不全相同,因为偶数个相同数字的亦或值为0,那么爱丽丝只要移除一个不为x的数字就行了,这样移除后数组的亦或值也不会是0,那么由于鲍勃也是个机智的boy,他也不会移除一个使得剩余数组亦或值为0的数字,but,到了最后一个数字时,鲍勃别无选择只能移除最后一个数字,此时数组为0,亦或值为0,爱丽丝获胜。那此时你可能会有疑问,为啥奇数个数字且亦或值不为0时,爱丽丝一定会输?因为即便爱丽丝先移除掉了一个数字,使得数组亦或值仍不为0,那么此时鲍勃面对的情况就是偶数个数字使得数组亦或值不为0,这跟上面推论爱丽丝一定会赢的情况一样,鲍勃也是个聪明的蓝孩纸,所以爱丽丝会输,参见代码如下:

解法一:

class Solution {
public:
bool xorGame(vector<int>& nums) {
int x = , n = nums.size();
for (int num : nums) x ^= num;
return x == || n % == ;
}
};

下面这种解法就很秀了,比大军师大司马吴秀波还秀,直接用个accumulate一行搞定亦或值,博主只想吐槽这道题的难度级别,大家有见过一行解出一道Hard题吗,做梦都要笑醒了吧~

解法二:

class Solution {
public:
bool xorGame(vector<int>& nums) {
return nums.size() % == || !accumulate(nums.begin(), nums.end(), , bit_xor<int>());
}
};

类似题目:

Nim Game

参考资料:

https://leetcode.com/problems/chalkboard-xor-game/solution/

https://leetcode.com/problems/chalkboard-xor-game/discuss/133807/1-line-C++-solution

https://leetcode.com/problems/chalkboard-xor-game/discuss/121696/C++JavaPython-3-lines-Easy-Solution-with-Complaint-and-Explanation

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Chalkboard XOR Game 黑板亦或游戏的更多相关文章

  1. LintCode——Chalkboard XOR Game(黑板游戏)

    黑板游戏: We are given non-negative integers nums[i] which are written on a chalkboard. Alice and Bob ta ...

  2. Java实现 LeetCode 810 黑板异或游戏 (分析)

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

  3. 51nod-1661 1661 黑板上的游戏(组合游戏)

    题目链接: 1661 黑板上的游戏 Alice和Bob在黑板上玩一个游戏,黑板上写了n个正整数a1, a2, ..., an,游戏的规则是这样的:1. Alice占有先手主动权.2. 每个人可以选取一 ...

  4. [Swift]LeetCode810. 黑板异或游戏 | Chalkboard XOR Game

    We are given non-negative integers nums[i] which are written on a chalkboard.  Alice and Bob take tu ...

  5. Weekly Contest 78-------->810. Chalkboard XOR Game

    We are given non-negative integers nums[i] which are written on a chalkboard.  Alice and Bob take tu ...

  6. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  7. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  8. [LeetCode] Design Tic-Tac-Toe 设计井字棋游戏

    Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the fol ...

  9. Leetcode: Maximum XOR of Two Numbers in an Array

    Given a non-empty array of numbers, a0, a1, a2, - , an-1, where 0 ≤ ai < 231. Find the maximum re ...

随机推荐

  1. css层叠规则,优先级算法

    前言 层叠样式表CSS最基本的一个特性就是层叠.冲突的声明通过层叠进行排序,由此确定最终的文档表示.而这个过程的核心就是选择器及其相关声明的特殊性.重要性.来源及继承机制.本文将详细介绍CSS层叠 特 ...

  2. [物理学与PDEs]第4章第2节 反应流体力学方程组 2.2 反应流体力学方程组形式的化约

    1.  粘性热传导反应流体力学方程组 $$\beex \bea \cfrac{\rd \rho}{\rd t}&+\rho \Div{\bf u}=0,\\ \cfrac{\rd Z}{\rd ...

  3. css 兼容各种iPhone

    @media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){/* 兼容iphone4/4s */ .class{} } @m ...

  4. Contest2154 - 2019-2-28 高一noip基础知识点 测试1 题解版

    传送门 预计得分:100+100+100+100=400 实际得分:55+100+60+80=295 细节决定成败啊!!! T1 这道题思路很简单,就是一些细节很变态坑人 首先,数据不一定是有序的,虽 ...

  5. 第四周结对项目总结及改进(ui/web)

    项目介绍 随着社会科技的进步和多媒体教育的日益发展,越来越来的学生正在接受着新时代下的教育模式,而且手机.电脑等科技产品的普及以及其带来的更高效更便捷的模式 使得它们成为当代学生学习中的一种很好的学习 ...

  6. (三)微信小程序首页的分类功能和搜索功能的实现笔记

    就在昨天,微信宣布了微信小程序开发者工具新增“云开发”功能 下载最新的开发者工具,现在无需服务器即可实现小程序的快速迭代! 分类功能和搜索功能的效果图 1.首页分类功能的实现 boxtwo方法(.js ...

  7. 基于redis的cas集群配置

    1.cas ticket统一存储 做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致.官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方 ...

  8. 基于VC的MFC界面开发

    教你熟悉VC6.0创建一个可视化软件的过程 UpdateData(TRUE);//将输入数据赋给文本框变量. UpdateData(FALSE);//将内容显示在文本框中 AfxMessageBox( ...

  9. Java基础7-异常;jar包

    昨日内容回顾 多态:多种状态,多态的前提条件是继承或者是实现 面向接口编程 降低耦合度 接口是最低标准,接口可以多重继承 接口中的所有方法都是抽象方法 抽象类中可以没有抽象方法 匿名内部类对象 将对类 ...

  10. Web从入门到放弃<3>

    UI简单的美化全部来源于Bootstrap 知识来自<javascript dom编程艺术第二版> <1> 点击列表 页面不跳转图片刷新:  主要点: href如何点击完如何不 ...