1025 除数游戏
小艾 和 小鲍 轮流玩游戏,小艾首先开始。
最初,黑板上有一个数字 n 。在每个玩家的回合中,该玩家做出的动作包括:
- 选择任意 x,使 0 < x < n 和 n % x == 0 。
- 将黑板上的数字 n 替换为 n - x 。
此外,如果玩家无法采取行动,他们就会输掉比赛。
当且仅当 小艾赢得游戏时返回 true ,假设两个玩家都发挥最佳。
例子
在大学某个自习的下午,小白坐在教室看到这道题。想想现年景一过,没有什么理由再不学习了。真是若对黄花孤负酒,怕黄花,也笑人岑寂。
这时候黑长直女神过来问:小白,你看到1025这道题了吗,怎么感觉看着很简单,但是理解起来很麻烦啊,这道题你有什么思路呢?
小白内心镇定:这机会不就来了吗,小美,《一起摇太阳》有机会一起去看看吧?
哦,不是,题目描述意思说的简单一些。
这种题目我们首先把他进行下条件梳理,
从这个问题来看,小艾可以从 1 to N 中选择一个数字,并且她必须选择优化她的获胜。同样,小鲍也会努力为自己赢得胜利。
考虑如果数字是 2 ,小艾以 1 开头并且她赢了
对于 3 ,小艾选择 1 ,小鲍再次选择 1 ,小艾输了
咱们拿4举个例子
4 = 小艾 -> (4 - 1) - 剩下 3 给 小鲍
3 = 小鲍 -> (3 -1) - 剩下 2 给 小艾
2 = 小艾 -> (2 - 1) - 剩下 1 给 小鲍
现在鲍勃无法选择任何东西,他输了
像这样,如果我们尝试每个数字,我们将得到一个模式,如果我们知道 N 是奇数,那么 小艾输了,如果 N 是偶数小艾赢了。
解决这个问题的简单方法是返回 N % 2 == 0
小白:没问题,谁叫为了“真爱”呢。
真正面试环节
面试官:咱们今天来个轻松的,你可以解答这道”除数游戏“的题目吗,来看看你对简单题目的理解。
小白:嘿嘿,这不巧了么这不是。
public boolean divisorGame(int N) {
return N % 2 == 0;
}
小明:OK,完事儿,等着面试官来表扬自己吧。他肯定会说:小子,你是个好手!工位都给你准备好了,工资你说了算。
面试官:矮油,不错啊,不过你是不是完成的太快了,这么一行就像糊弄我。是否还有其他办法呢。
小明OS:今年这个找工市场,人言洛阳花似锦,偏我来时不逢春。。。不是,谁让你这出题正好有简单方法呢!
public static boolean divisorGame(int N) {
// dp数组,dp[i]表示N=i时,小艾是否能获胜
boolean[] dp = new boolean[N + 1];
for (int i = 2; i <= N; i++) {
// 对于每个N,遍历所有可能的选择
for (int x = 1; x < i; x++) {
if (i % x == 0 && !dp[i - x]) {
dp[i] = true;
break;
}
}
}
return dp[N];
}
小白:您好,面试官,这回可以了吧,我终于有钱请小美看电影了!
============================================================================
🍀🍀🍀🍀🍀🍀更多算法题解请看 面试数据结构与算法总结分类+leetcode目录【基础版】
编码道路漫漫,只要先看脚下的路,徐徐前进即可。