LeetCode 3360: Stone Removal Game (Simulation)
LeetCode 3360SimulationToday we solve LeetCode 3360 - Stone Removal Game.
Source: https://leetcode.com/problems/stone-removal-game/
English
Start with n stones. Players remove 10, 9, 8... stones in order. If you cannot remove required stones, you lose.
Key Insight
The sequence of required removals is deterministic, so we just simulate turns and flip current player after each valid move.
Complexity
At most 10 turns, so time O(1) and space O(1).
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public boolean canAliceWin(int n) {
int remove = 10;
boolean aliceTurn = true;
while (n >= remove) {
n -= remove;
remove--;
aliceTurn = !aliceTurn;
}
return !aliceTurn;
}
}func canAliceWin(n int) bool {
remove := 10
aliceTurn := true
for n >= remove {
n -= remove
remove--
aliceTurn = !aliceTurn
}
return !aliceTurn
}class Solution {
public:
bool canAliceWin(int n) {
int remove = 10;
bool aliceTurn = true;
while (n >= remove) {
n -= remove;
remove--;
aliceTurn = !aliceTurn;
}
return !aliceTurn;
}
};class Solution:
def canAliceWin(self, n: int) -> bool:
remove = 10
alice_turn = True
while n >= remove:
n -= remove
remove -= 1
alice_turn = not alice_turn
return not alice_turn/**
* @param {number} n
* @return {boolean}
*/
var canAliceWin = function(n) {
let remove = 10;
let aliceTurn = true;
while (n >= remove) {
n -= remove;
remove--;
aliceTurn = !aliceTurn;
}
return !aliceTurn;
};中文
给定 n 个石子,双方按固定顺序每回合分别拿走 10、9、8... 个。如果当前需要拿的数量大于剩余石子,则该玩家失败。
核心思路
每一步要拿多少是固定递减的,所以直接模拟即可。每执行一次合法操作就切换当前玩家,最后无法操作的人输。
复杂度
最多执行 10 次操作,时间复杂度 O(1),空间复杂度 O(1)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public boolean canAliceWin(int n) {
int remove = 10;
boolean aliceTurn = true;
while (n >= remove) {
n -= remove;
remove--;
aliceTurn = !aliceTurn;
}
return !aliceTurn;
}
}func canAliceWin(n int) bool {
remove := 10
aliceTurn := true
for n >= remove {
n -= remove
remove--
aliceTurn = !aliceTurn
}
return !aliceTurn
}class Solution {
public:
bool canAliceWin(int n) {
int remove = 10;
bool aliceTurn = true;
while (n >= remove) {
n -= remove;
remove--;
aliceTurn = !aliceTurn;
}
return !aliceTurn;
}
};class Solution:
def canAliceWin(self, n: int) -> bool:
remove = 10
alice_turn = True
while n >= remove:
n -= remove
remove -= 1
alice_turn = not alice_turn
return not alice_turn/**
* @param {number} n
* @return {boolean}
*/
var canAliceWin = function(n) {
let remove = 10;
let aliceTurn = true;
while (n >= remove) {
n -= remove;
remove--;
aliceTurn = !aliceTurn;
}
return !aliceTurn;
};