欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > LeetCode题练习与总结:Nim 游戏--292

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

2024/10/23 15:19:51 来源:https://blog.csdn.net/weixin_62860386/article/details/142799599  浏览:    关键词:LeetCode题练习与总结:Nim 游戏--292

一、题目描述

你和你的朋友,两个人一起玩 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 <= 2^31 - 1

二、解题思路

Nim游戏的胜利策略是基于数学的。当石头数量为4的倍数时,无论你如何取石头,你的对手都可以通过取走剩余石头数量减去4的倍数的石头来确保最终获胜。因此,如果你面对的是4的倍数个石头,你将会输掉游戏。反之,如果你面对的不是4的倍数个石头,你可以通过取走一定数量的石头,使得剩下的石头数量成为4的倍数,从而确保自己最终获胜。

具体来说,如果 n % 4 != 0,那么你可以通过取走 n % 4(1、2、或3块石头)来使得剩下的石头数量为4的倍数,这样无论对手如何取石头,你都可以在接下来的回合中继续保持这种优势,直到赢得游戏。

三、具体代码

class Solution {public boolean canWinNim(int n) {// 如果石头数量不是4的倍数,则可以赢得游戏return n % 4 != 0;}
}

这段代码非常简洁,只需要判断石头数量是否为4的倍数即可。如果不是,返回 true 表示可以赢得游戏;如果是,返回 false 表示无法赢得游戏。

四、时间复杂度和空间复杂度

1. 时间复杂度

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

因此,整个函数的时间复杂度也是 O(1)。

2. 空间复杂度

该函数 canWinNim 没有使用任何额外的数据结构,如数组、列表、栈、队列等,也没有递归调用或分配额外的内存空间。它只使用了固定数量的几个变量(n 和返回值),这些变量所占用的空间不会随着输入数据的大小而变化。

因此,该函数的空间复杂度是 O(1)。

综上所述,canWinNim 函数的时间和空间复杂度都是 O(1)。

五、总结知识点

  1. 类定义(Class Definition):class Solution { ... }: 定义了一个名为 Solution 的类。

  2. 访问修饰符(Access Modifiers):public: 表示方法可以被任何其他类访问。

  3. 方法定义(Method Definition):public boolean canWinNim(int n) { ... }: 定义了一个名为 canWinNim 的公共方法,该方法接受一个整数参数 n 并返回一个布尔值。

  4. 方法返回类型(Return Type):boolean: 指定方法返回一个布尔类型的值。

  5. 参数(Parameters):int n: 定义了一个整数类型的参数 n,用于接收传入的石头数量。

  6. 取模运算符(Modulo Operator):%: 用于计算一个数除以另一个数的余数。

  7. 逻辑非运算符(Logical NOT Operator):!: 用于反转布尔表达式的结果。

  8. 条件表达式(Conditional Expression):n % 4 != 0: 这是一个条件表达式,用于判断 n 是否不是4的倍数。

  9. 返回语句(Return Statement):return n % 4 != 0;: 返回条件表达式的结果,即如果 n 不是4的倍数,则返回 true,否则返回 false

  10. 整数除法(Integer Division):n % 4: 这里使用了整数除法的余数操作,判断 n 除以4的余数是否为0。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com