2021/5/22 leetcode每日一题(java)

黑板异或游戏

题目要求

黑板上写着一个非负整数数组 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 仍然会输掉游戏。

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/chalkboard-xor-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

使用数学推理方法。
由题目可知,若初始情况下nums数组中所有元素的异或结果为0,那么Alice直接获胜。

若初始情况下数组异或和不为0,那么可知,玩家若想要赢得游戏,需要在数组中选取任何一个数字,使得剩下的所有数字异或和依旧不为0。
设有S = nums[0] ^ nums[1] ^ ... ^ nums[nums.length-1]。已知S != 0;
令0 <= i <= nums.length - 1, 且S xor nums[i] != 0。
则有nums[i] != S;

可知要满足这个条件,需要nums中所有的元素不都为S。
若nums中所有元素都为S,那么
若nums.length是偶数,S = 0,与题设不符,
若nums.length是奇数,抽取任意一个数字都会导致S xor nums[i] = 0,从而直接输掉游戏。

可知
当nums.length为偶数且S != 0时,总能选取i,令S xor nums[i] != 0;
当nums.length为奇数且S != 0时,若数组长度为1,或所有元素都为S时,那么此时进行游戏的人必输无疑。
可以看出,在面临偶数项数组时,要么直接获得胜利,要么稳操胜券。
反之,若面临奇数项数组的玩家不能直接取得胜利,那么必将输掉比赛。

又可知Alice与Bob交替擦去数字,可知两人每次擦除数字前所面对的数组奇偶性都是相同的。
即若初始数组元素数量为奇数,那么Alice总是会从奇数个数字中选取一个数字擦除,反之则从偶数个中选取。

若初始数组个数为偶数,且S != 0:
Alice总是面对偶数项的数组,此时Alice必胜。
若初始数组个数为奇数,且S != 0;
Bob总是面对偶数项的数组,此时Bob必胜。

java代码

class Solution {
  public boolean xorGame(int[] nums) {
    int xor = 0;
    for(int i = 0; i < nums.length; i++){
      xor ^= nums[i];
    }
    if(xor == 0){
      return true;
    }else{
        return nums.length % 2 == 0;
    }
  }
}

效率分析

时间复杂度O(n),空间复杂度O(1);

posted @ 2021-05-22 10:50  echo855  阅读(91)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示