LeetCode - NimGame

开始刷算法题了,尽量一天一道。

这里写图片描述

一、分析

拿到一道题目,首先我们要冷静分析,千万不要一上来就直接搞代码,那样纯粹是浪费时间。偏偏这是我这种初级程序员最喜欢干的。

这个题最初的意思是:

两个人拿石头,每一次只能拿1~3块石头,“我”先拿,最后拿的人胜利,且我和对手都是聪明且想赢的。

翻译成中文之后我们需要抽象这道题的意思,把它再翻译成数学语言。

  • 两个人拿石头,其实就是对一个数字做减法
  • 我先拿,其实就是设定一个初始条件
  • 最后拿的人胜利,其实就是判断拆分成奇数个还是偶数个
  • 都是聪明且都想赢,其实就是尽可能的少拆分

最后我们得到的题意是:

将一个数字拆分成由1~3组合的数字,判断拆分的个数。

二、然后就先举例子去试探规律

1=>true
2=>true
3=>true
4=>false
5=>true
6=>true
7=>true
8=>false
.
.
.

验证4=>false

4=1+3 失败
4=2+2 失败
4=3+1 失败

验证5=>true

5=1+4 由于4是自己输,所以5一定是自己赢。
5=2+3 失败
5=3+2 失败

由于两个人都是聪明且想赢的,所以“我”一定会选择5=1+4从而获得胜利

验证6,7,8

6=1+5
6=2+4
6=3+3
由于4是必输,所以6可以通过6=2+4,转换成4,所以一定会胜利。

7=1+6
7=2+5
7=3+4 

在这里我们就发现了,只要能转化成4的就可以获得胜利。因为4是原必输态,也就是现在的必胜态。

8=1+7
8=2+6
8=3+5 
由于5,6,7都是必输的。

然后我们就发现其实只要是能整除4的都是false,所以这道题就变成了如何判断一个数字是否能整除4。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值