大家好,我是吴师兄。
假如你作为一个校招生,收到了小米汽车的Offer,会不会去呢?会不会直接躺平,不去面其它公司了,等着入职小米汽车就行。
再假如你是准备跳槽,拿到了小米汽车的Offer,会不会直接去呢?
去年 10 月份有个同学跳槽期间遇到了这种情况,最后的结局是去了大众中国,放弃了小米汽车的offer。
如果时间来到现在,让楼主再面临同样的抉择,不知道是否会不一样。
继续今天的算法学习,来一个简单的算法题:Nim 游戏。
你和你的朋友,两个人一起玩 Nim 游戏:
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 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 <= 2^31 - 1
要解决这个问题,我们首先需要理解 Nim 游戏的基本规则和胜负条件。在 Nim 游戏中,每一位玩家的目标是尽量让对手面临无法取走最后一颗石头的局面。因此,每位玩家在自己的回合中应该采取策略,使得剩余石头的数量模 4 不等于 0,这样无论对手取走多少石头,轮到自己的时候总能保持石头的数量模 4 不等于 0。
观察题目中给出的代码,我们可以发现一个简单而巧妙的规律。代码中的函数 canWinNim(int n)
返回的是一个布尔值,表示在给定的石头数量下,当前玩家是否能赢得 Nim 游戏。函数的核心逻辑是通过判断石头数量 n 是否满足某个条件来决定返回值。具体来说,代码中使用了一个简单的数学运算 n % 4 != 0
,其含义是判断给定的石头数量 n 是否满足石头数量模 4 不等于 0 的条件。如果满足条件,则返回 true,表示当前玩家能赢得游戏;如果不满足条件,则返回 false,表示当前玩家不能赢得游戏。
接下来,我们来分析这个数学运算的原理。在 Nim 游戏中,我们知道如果剩余石头的数量模 4 等于 0,那么当前玩家无论拿走多少石头,对手总能保持石头数量模 4 不等于 0 的情况,从而最终取胜。因此,我们的目标是让剩余石头的数量模 4 不等于 0,这样无论对手拿走多少石头,我们都能保持优势。根据这一原理,我们可以得出结论:当剩余石头数量模 4 等于 0 时,当前玩家无法赢得 Nim 游戏;当剩余石头数量模 4 不等于 0 时,当前玩家能赢得 Nim 游戏。
结合以上分析,我们可以得出以下结论:给定的石头数量 n 模 4 不等于 0 时,当前玩家能赢得 Nim 游戏;反之,当前玩家无法赢得 Nim 游戏。这正是代码中 return n % 4 != 0;
这一行代码的逻辑所在。
接下来,我们来讨论该算法的时间复杂度和空间复杂度。由于算法中仅包含了一次简单的数学运算,因此其时间复杂度为 O(1),即算法的执行时间与输入规模无关。同时,算法中也没有使用额外的数据结构或内存空间,因此其空间复杂度为 O(1),即算法的内存消耗是常数级的。这意味着该算法在时间和空间方面都具有很好的效率。
总结:
Nim 游戏是一种经典的博弈游戏,涉及两位玩家轮流在一堆石头上进行取石子的操作。要判断第一个玩家是否能赢得 Nim 游戏,我们可以通过简单的数学运算来得出结论。具体而言,如果初始石头数量模 4 不等于 0,则第一个玩家能赢得游戏;反之,则第一个玩家无法赢得游戏。这一结论的原理是基于 Nim 游戏的规则和胜负条件,通过使剩余石头数量模 4 不等于 0,来确保每位玩家都能保持优势。在给出的代码中,我们可以看到这一逻辑的简洁实现,通过一行代码即可完成对 Nim 游戏胜负的判断。该算法具有时间和空间效率高的特点,适用于实际应用中对 Nim 游戏胜负进行判断的场景。
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 添加微信 278166530 获取最新课程
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// Nim游戏(LeetCode 292):https://leetcode.cn/problems/nim-game/
class Solution {
public boolean canWinNim(int n) {
return n % 4 != 0;
}
}
class Solution {
public:
bool canWinNim(int n) {
return n % 4 != 0;
}
};
class Solution:
def canWinNim(self, n: int) -> bool:
return n % 4 != 0