leetcode 810. 黑板异或游戏
黑板上写着一个非负整数数组 nums[i] 。Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手。如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败。 (另外,如果只剩一个数字,按位异或运算得到它本身;如果无数字剩余,按位异或运算结果为 0。)
换种说法就是,轮到某个玩家时,如果当前黑板上所有数字按位异或运算结果等于 0,这个玩家获胜。
假设两个玩家每步都使用最优解,当且仅当 Alice 获胜时返回 true。
示例:
输入: nums = [1, 1, 2]
输出: false
解释:
Alice 有两个选择: 擦掉数字 1 或 2。
如果擦掉 1, 数组变成 [1, 2]。剩余数字按位异或得到 1 XOR 2 = 3。那么 Bob 可以擦掉任意数字,因为 Alice 会成为擦掉最后一个数字的人,她总是会输。
如果 Alice 擦掉 2,那么数组变成[1, 1]。剩余数字按位异或得到 1 XOR 1 = 0。Alice 仍然会输掉游戏。
解题思路
奇偶不变
因为ALice和Bob是轮流取数字的,所以如果刚开始的元素个数是偶数个,那么Alice每次取元素时,元素都是偶数。
S^nums[i]=Si
设Si为数组去掉第i个元素以后的异或的结果,S为所有元素异或的结果,即有Sinums[i]=S,变形得Snums[i]=Si
反证法
在数组长度为偶数并且S!=0(因为如果S=0,那么就胜负已经确定了)的情况,假设无论取走的元素是哪个,都有Si=0
即S0=0,S1=0…,等价于S0S1S2…=0,代入S^nums[i]=Si
得
(S^nums[0])^(S^nums[1])^....=0
(S^S...)^(nums[0]^nums[1]....)=0
又因为S为所有元素异或的结果,并且数组长度为偶数,所以有偶数个S,因此
S^S…(奇数个S)=0,即S=0,与S!=0矛盾,所以可以得出无论取走的元素是哪个,都不存在Si=0,也就是说数组长度为偶数的那一方,可以使得另一方永远产生不了剩下元素异或结果为0的情况。
所以Alice要想赢,只需要两种情况
- 原数组异或的结果是0,因为Alice是先手,所以直接就赢了
- 原数组的长度为偶数
代码
class Solution {public boolean xorGame(int[] nums) {int res=0;if((nums.length&1)==0) return true;for (int num : nums) {res^=num;}return res==0;}
}
leetcode 810. 黑板异或游戏相关推荐
- LeetCode 810. 黑板异或游戏(博弈推理)
1. 题目 一个黑板上写着一个非负整数数组 nums[i] . 小红和小明轮流从黑板上擦掉一个数字,小红先手. 如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败 ...
- 【LeetCode每日一题】810. 黑板异或游戏
[LeetCode每日一题]810. 黑板异或游戏 题目: 黑板上写着一个非负整数数组 nums[i] .Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手.如果擦除一个数字后,剩余的 ...
- 文巾解题 810. 黑板异或游戏
1 题目描述 2 解题思路 ·根据游戏规则,轮到某个玩家时,如果当前黑板上所有数字异或结果等于 0,则当前玩家获胜.由于 Alice 是先手,因此如果初始时黑板上所有数字异或结果等于 0,则Alice ...
- 2021-05-22 黑板异或游戏
题目: 题目地址: https://leetcode-cn.com/problems/chalkboard-xor-game/submissions/ 黑板异或游戏 黑板上写着一个非负整数数组 num ...
- [Swift]LeetCode810. 黑板异或游戏 | Chalkboard XOR Game
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- leetcode 810. Chalkboard XOR Game
leetcode 810. Chalkboard XOR Game 原题地址:https://leetcode.com/problems/chalkboard-xor-game/ 题目 We are ...
- 【LeetCode击败99%+】Nim 游戏
题目 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头. 你们轮流进行自己的回合,你作为先手. 每一回合,轮到的人拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者. 假设你们每一 ...
- LeetCode——1803. 统计异或值在范围内的数对有多少(Count Pairs With XOR in a Range)[困难]——分析及代码(Java)
LeetCode--1803. 统计异或值在范围内的数对有多少[Count Pairs With XOR in a Range][困难]--分析及代码[Java] 一.题目 二.分析及代码 1. 暴力 ...
- LeetCode 1535. 找出数组游戏的赢家
文章目录 1. 题目 2. 解题 1. 题目 给你一个由 不同 整数组成的整数数组 arr 和一个整数 k . 每回合游戏都在数组的前两个元素(即 arr[0] 和 arr[1] )之间进行. 比较 ...
最新文章
- webbrowser php,C# WinForm WebBrowser 设置为编辑模式的示例代码
- Spring Cloud Gateway 之获取请求体的几种方式
- 监听输入 vue_深度对比vue与react创建APP的差别,值得收藏
- 如何用css和HTML结合画熊,结合伪元素实现的纯CSS3高级图形绘制
- c语言程序题是如何判分的,C语言编程题判分系统的研究与实现
- C语言课后习题(49)
- Java创建对象小结
- 阿里云河源数据中心正式开服 疫情期间曾2小时扩容1万台云服务器
- 语音识别的准确率,永远达不到100%?
- php10天速成培训,十天学会php之第九天
- 数据结构上机实践第14周项目1(3) - 验证算法(二叉排序树)
- 详细讲解32F103/MS51单片机串口ISP程序下载的方法和操作步骤
- linux系统每次开机分辨率,解决linux分辨率设置过高 不能进入图形界面
- 激活Windows Vista Home Basic Aero玻璃效果
- java点击注册跳转到注册页面_web项目为什么点击注册按钮跳转不到注册页面?...
- 计算机硬件检测与维修理论试题,计算机硬件检测与维修试题10.doc
- 万豪国际集团公布新任首席执行官和总裁
- 《经典算法》数独问题
- go语言中的换行和分号
- 程序员们,挑一把适合自己的机械键盘吧。。
热门文章
- linux下 最常用基本命令
- 【信号】信号集、sigprocmask、sigpending
- 保驾护航金三银四,使用指南
- 自适应阈值化操作:adaptiveThreshold()函数
- ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)
- 解决EF 4.0 中数据缓存机制
- HDOJ---2236 无题II[二分枚举+匈牙利]
- iOS5 UI 设计新手段 Storyboard
- 同层物体间的遮挡处理
- mysql实战33 | 我查这么多数据,会不会把数据库内存打爆?