810. 黑板异或游戏

思路:
这个题感觉更像是数学推导,这里我注意到题目的“假设两个玩家每步都是用最优解”,疑问这个最优解是个什么意思。
首先我们来推导一下,假如去掉一个数让剩下的数异或为0,根据异或的性质:相同的数异或为0 and 任何数与0异或还是本身 可以得到下面的式子:
xorsum是所有数异或的结果,nums[i]在这是被去除掉的数
xorsum ^ nums[i] = 0 ,那么我们考虑何为“每步都是最优解”,假如我们去掉一个数 导致剩下的数异或为0,那么他就输了自然不是最优解,那么我们就能有其他的选择让剩下的数异或不为0。所以如果满足最优解的条件,并且为0,那么自然就是所有的数去掉都会导致剩下的数异或为0,因此我们可以有下面的式子:
xorsum ^ nums[i] = 0 ; xorsum ^ nums [i-1] =0 xorsum ^ nums[i-2] =0
所以:
xorsum ^ nums[i] ^ xorsum ^ nums [i-1] ^ xorsum ^ nums[i-2]....xorsum ^ nums[1] = 0
(xorsum ^ xorsum ^ ... ^ xorsum) ^ (num[1] ^ nums[2]... ^ nums[i]) = 0
(xorsum ^ xorsum ^ ... ^ xorsum) ^ xorsum = 0;
上述公式要为0,那么xorsum的个数为偶数个,xorsum 个数和nums的元素个数相同因此我们可以得到如下结论:
若是先手赢,那么要么nums异或结果为0(因为到第一次先手之前就为0了,先手还没动手呢,那自然先手赢了)或nums元素个数为偶数个。
那么我们的代码也就出来了,我们只需要判断nums异或结果是否为0,和nums.size()是否为偶数即可。

class Solution {
public:
    bool xorGame(vector<int>& nums) {
        int n=nums.size();
        int xorsum=0;
        for(int i=0;i<n;++i){
            xorsum = xorsum^nums[i];
        }
        if(xorsum==0) return true;
        else if(n%2==0) return true;
        return false;
    }
};
posted @ 2021-05-22 21:34  Mrsdwang  阅读(52)  评论(0编辑  收藏  举报