【LeetCode】每日一题 2024_11_5 求出硬币游戏的赢家(模拟/数学)
前言
每天和你一起刷 LeetCode 每日一题~
LeetCode 启动!
题目:求出硬币游戏的赢家
代码与解题思路
先读题:
题目要求玩家每轮拿出 115 的硬币,但是只有 x 带有 5,y 是 10,这意味着每一轮只能通过拿 1 个 x 和 4 个 y 进行游戏,最简单的方法就是直接依照题意进行模拟,代码如下:
func losingPlayer(x int, y int) string {
// 因为要拿出总和为 115 的硬币,所以必须要 1 个 x 和 4 个 y
cnt := 0
for x > 0 && y > 3 {
x -= 1
y -= 4
cnt++
}
if cnt&1 == 0 {
return "Bob"
}
return "Alice"
}
像这样有规律的情况,也可以用数学方法 O(1) 解决这个问题:
当 x 和 y%4 其中一个是偶数的时候(以 x 的数量是 0 为例),Bob 会赢,因为到 Alice 拿,但是数量不足了
当其中一个是奇数的时候(以 x 的数量是 1 为例),Alice 会赢,因为 Alice 拿完之后,Bob 就不能拿够数量了
代码如下:
func losingPlayer(x int, y int) string {
return [2]string{"Bob", "Alice"}[min(x, y/4)%2]
}
每天进步一点点,我们明天不见不散~
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。