LeetCode题练习与总结:Nim 游戏--292

打印 上一主题 下一主题

主题 838|帖子 838|积分 2514

一、题目形貌

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


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

示例 1:
  1. <strong>输入:</strong>n = 4
  2. <strong>输出:</strong>false
  3. <strong>解释:</strong>以下是可能的结果:
  4. 1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。
  5. 2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。
  6. 3.你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。
  7. 在所有结果中,你的朋友是赢家。
复制代码
示例 2:
  1. <strong>输入:</strong>n = 1
  2. <strong>输出:</strong>true
复制代码
示例 3:
  1. <strong>输入:</strong>n = 2
  2. <strong>输出:</strong>true
复制代码

提示:


  • 1 <= n <= 2^31 - 1
二、解题思路

Nim游戏的胜利策略是基于数学的。当石头数量为4的倍数时,无论你怎样取石头,你的对手都可以通过取走剩余石头数量减去4的倍数的石头来确保终极获胜。因此,如果你面对的是4的倍数个石头,你将会输掉游戏。反之,如果你面对的不是4的倍数个石头,你可以通过取走肯定数量的石头,使得剩下的石头数量成为4的倍数,从而确保自己终极获胜。
详细来说,如果 n % 4 != 0,那么你可以通过取走 n % 4(1、2、或3块石头)来使得剩下的石头数量为4的倍数,如许无论对手怎样取石头,你都可以在接下来的回合中继续保持这种上风,直到赢得游戏。
三、详细代码

  1. class Solution {
  2.     public boolean canWinNim(int n) {
  3.         // 如果石头数量不是4的倍数,则可以赢得游戏
  4.         return n % 4 != 0;
  5.     }
  6. }
复制代码
这段代码非常简洁,只需要判定石头数量是否为4的倍数即可。如果不是,返回 true 表现可以赢得游戏;如果是,返回 false 表现无法赢得游戏。
四、时间复杂度和空间复杂度

1. 时间复杂度

该函数 canWinNim 仅包含一个操作,即对输入参数 n 进行取模运算 n % 4。取模运算的时间复杂度是常数时间复杂度,记作 O(1)。
因此,整个函数的时间复杂度也是 O(1)。
2. 空间复杂度

该函数 canWinNim 没有使用任何额外的数据结构,如数组、列表、栈、队列等,也没有递归调用或分配额外的内存空间。它只使用了固定数量的几个变量(n 和返回值),这些变量所占用的空间不会随着输入数据的巨细而变革。
因此,该函数的空间复杂度是 O(1)。
综上所述,canWinNim 函数的时间和空间复杂度都是 O(1)。
五、总结知识点


  • 类界说(Class Definition):class Solution { ... }: 界说了一个名为 Solution 的类。
  • 访问修饰符(Access Modifiers):public: 表现方法可以被任何其他类访问。
  • 方法界说(Method Definition):public boolean canWinNim(int n) { ... }: 界说了一个名为 canWinNim 的公共方法,该方法接受一个整数参数 n 并返回一个布尔值。
  • 方法返回类型(Return Type):boolean: 指定方法返回一个布尔类型的值。
  • 参数(Parameters):int n: 界说了一个整数类型的参数 n,用于接收传入的石头数量。
  • 取模运算符(Modulo Operator):%: 用于盘算一个数除以另一个数的余数。
  • 逻辑非运算符(Logical NOT Operator):!: 用于反转布尔表达式的结果。
  • 条件表达式(Conditional Expression):n % 4 != 0: 这是一个条件表达式,用于判定 n 是否不是4的倍数。
  • 返回语句(Return Statement):return n % 4 != 0;: 返回条件表达式的结果,即如果 n 不是4的倍数,则返回 true,否则返回 false。
  • 整数除法(Integer Division):n % 4: 这里使用了整数除法的余数操作,判定 n 除以4的余数是否为0。
以上就是办理这个题目的详细步骤,希望能够为各位提供开导和帮助。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表