题干:
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
分析:
Step 1:如果石头是1-3块,那我可以一次拿完,从而获胜。如果是4块石头,不论怎么拿都是对手获胜。
Step 2:如果多余4块石头,如果能保证最后一次拿完剩余4块石头,则我必胜。问题转换为:当石块大于4的时候,如何能让我拿完后剩余的石头是4块?
Step 3:一次可以拿1-3块,拿完剩余4块石头,则当前的石头必须是5-7块。要保证剩余5-7块石头,则对手拿之前石头数必须是8块。由此推出每多4块石头均可以通过匹配对手进行抵消,对手拿N块,则我拿4-N块。
Step 4:可以推出当我拿完剩余4的倍数时,对手必输。那么N块石头只要拿完1-3块后是4的倍数,则我必胜。推出只要N不是4的倍数,则一定可以通过拿掉1-3块使得N为4的倍数。则问题转换为求N是否为4的倍数。
Java题解
class Solution {
public boolean canWinNim(int n) {
return n%4!=0;
}
}
近期打算写写LeetCode各类题目,有兴趣的童鞋可以关注我。