开始刷算法题了,尽量一天一道。
一、分析
拿到一道题目,首先我们要冷静分析,千万不要一上来就直接搞代码,那样纯粹是浪费时间。偏偏这是我这种初级程序员最喜欢干的。
这个题最初的意思是:
两个人拿石头,每一次只能拿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。