题目大意:
黑板上写着一个非负整数数组 nums[i]
。Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手。如果擦除一个数字后,剩余的所有数字按位异或运算得出的结果等于 0 的话,当前玩家游戏失败。 (另外,如果只剩一个数字,按位异或运算得到它本身;如果无数字剩余,按位异或运算结果为 0。)
换种说法就是,轮到某个玩家时,如果当前黑板上所有数字按位异或运算结果等于 0,这个玩家获胜。
假设两个玩家每步都使用最优解,当且仅当 Alice 获胜时返回 true
。
来源:力扣(LeetCode
)
链接:https://leetcode-cn.com/problems/chalkboard-xor-game/
解决思路:
接下来给出我解答时的不太严谨的思路:
- 给出的数组长度为偶数:
- 数组异或和不是0:如果是都拿完的情况,还是
Alice
获胜。很明显,当Alice
拿完特定的数后,不会让之后的数异或和为0,即可以一直拿完保持不输。假设Alice
拿完数a
之后异或和为0,那么剩下的数组里面一定有不为a
的数,因为剩下的数组为奇数个,一定有两个不一样的数,否则异或和不可能为0。既然剩下的数组里面存在不为a
的数,当Alice
拿它时,剩下的数的异或和就不为0了。所以假设的情况不存在,Alice
一定有方法能拿到使得剩下数组异或和不为0的那个数。综上,Alice
一定能拿到最后拿完的情况,Alice
必胜。 - 数组异或和为0:
Alice
获胜。
- 数组异或和不是0:如果是都拿完的情况,还是
- 给出的数组长度为偶数:
- 数组异或和不是0:
Alice
拿完一个就变成上述情况的反例,即对方必胜。所以Alice
必输。 - 数组异或和为0:
Alice
获胜。
- 数组异或和不是0:
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public:
bool xorGame(vector<int>& nums) {
if (!(nums.size() & 1)) return true;
int XorSum = 0;
for (int x: nums)
XorSum ^= x;
if (XorSum)
return false;
return true;
}
};