LeetCode题目笔记——292. Nim 游戏 (脑筋急转弯C++/Python)

题目描述

你和你的朋友,两个人一起玩 Nim 游戏:

桌子上有一堆石头。 你们轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回
false 。

示例 1:

输入:n = 4 输出:false 解释:以下是可能的结果:

  1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。
  2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。
    3.你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。 在所有结果中,你的朋友是赢家。

示例 2:
输入:n = 1 输出:true
示例 3:

输入:n = 2 输出:true

提示:

1 <= n <= 231 - 1

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

题目难度——简单

方法一:脑筋急转弯

  乍一看这个题目好像很难,要考虑很多种情况,我先手,对方后手,每次可以拿1-3颗,那在石头充足的情况下每一轮拿取就有3×3=9种情况,要在这9种情况下判断谁谁输谁赢,看起来确实很复杂。
  但是!我知道你很急,但你先别急,题目已经给提示了,在n=4的时候,我们怎么样都是必输,那n=4必输,n=8呢,n=12呢,n=。。。呢?可以发现,只要是4的整数倍,我们最后还是会回到n=4的情况,所以只要是4的整数倍,我们必输。再看看不是4的情况,小于4自不必多说,肯定是我们赢,大于4的话,比如5,我们可以先手拿1个,形式就变成了了对手先手情况下只有4个石头。n=6,我们先手拿两个,n再大,我们也可以经过多轮的拿取,最后到拿了x个之后让对方面临只剩4个的情况。所以,这道题我们就只用判断n是不是4的整数倍即可。

代码/C++/Python

class Solution {
public:
    bool canWinNim(int n) {
        return n % 4 != 0;
    }
};

在这里插入图片描述

class Solution:
    def canWinNim(self, n: int) -> bool:
        return n % 4 != 0

总结

  这道题乍一看好像挺难,但其实是个脑筋急转弯。只有一行求余运算的代码,所以时间复杂度是O(1),空间也只有O(1)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值