LeetCode——292. Nim 游戏(Java)

题目描述

题干:
你和你的朋友,两个人一起玩 Nim 游戏:
桌子上有一堆石头。
你们轮流进行自己的回合,你作为先手。
每一回合,轮到的人拿掉 1 - 3 块石头。
拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。
请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。
如果可以赢,返回 true;否则,返回 false 。

示例 1:
输入:n = 4
输出:false 
解释:如果堆中有 4 块石头,那么你永远不会赢得比赛;
     因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

示例 2:
输入:n = 1
输出:true

示例 3:
输入:n = 2
输出:true

题解思路

返回是否可以赢下游戏,当然这种问题就是属于头脑风暴了,因为你先手和每次都是最优解

所以其实在一开始你的输赢就已经敲定了,只要你能控制在数量为4的时候是对方的回合

那无论他拿多少个你都能获取最后的胜利,但是这里还有个规律就是,因为每次只能拿到1到3个

所以每次遇到4的倍数,对面也可以让你一直卡在4的倍数上,所以只要是4的倍数就必须是对面的回合

正确代码

    public boolean canWinNim(int n) {
        if (n % 4 == 0) {
            return false;
        } else {
            return true;
        }
    }

总结

脑筋急转弯问题,以前遇到一个算法题也是你每次先手,但是规则不同,那道题是直接return true

因为只要你作为先手,总有方法让自己获得最终的胜利,果然学好数学思维是多么的重要

如果文章存在问题或者有更好的题解,欢迎大家在评论区斧正和评论,各自努力,你我最高处见

LeetCode——292. Nim 游戏(Java)

上一篇:java版gRPC实战之六:客户端动态获取服务端地址


下一篇:使用SQL SERVER存储过程实现历史数据迁移