这是悦乐书的第203次更新,第213篇原创
01 看题和准备
你和你的朋友正在玩下面的Nim游戏:桌子上有一堆石头,每次你轮流去除1到3块石头。 移除最后一块石头的人将成为赢家。 你是第一个取出石块的。
你们两个都非常聪明,并且拥有最佳的游戏策略。 编写一个函数来确定你是否可以在堆中的石头数量的情况下赢得游戏。例如:
输入:4
输出:false
说明:如果堆中有4块石头,那么你永远不会赢得游戏;无论你删除了1,2或3块石头,你的朋友都能去除它。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 解题
这道题有点像排列组合,给定一个整数n,在1到3之间进行随机组合,判断能否在奇数次移除石头的组合下,将n变为0。当n等于1,2,3时,你都可以一次将其移除。当n等于4的时候,你无论怎么移都会输。当n等于5的时候,第一次移动一块,剩下4块给另外一个人移除,另外一个人就会陷入4的死局,你就能在第二次移除的时候赢,当n等于6和7的时候,结局是一样的。当n等于8的时候,结局和n等于4一样,怎么选都会输。对此,只要是4的倍数,都是输局,所以简单的判断就变成了n对4取余是否等于0。
public boolean canWinNim(int n) {
if (n <= 4) {
return n == 1 || n == 2 || n == 3;
}
return n%4 != 0;
}
此解法的时间复杂度是O(1),空间复杂度是O(1)。
03 小结
算法专题目前已连续日更超过二个月,算法题文章69+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!