leetcode腦經急轉彎問題分享

問題1025:除數博弈
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。
最初,黑板上有一個數字 N 。在每個玩家的回合,玩家需要執行以下操作:
選出任一 x,滿足 0 < x < N 且 N % x == 0 。
用 N - x 替換黑板上的數字 N 。
如果玩家無法執行這些操作,就會輸掉遊戲。
只有在愛麗絲在遊戲中取得勝利時才返回 True,否則返回 false。假設兩個玩家都以最佳狀態參與遊戲。

示例 1:

輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無法進行操作。

示例 2:

輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,然後愛麗絲無法進行操作。

問題分析:由上述實例可以看出,愛麗絲拿到的是2,就會獲得勝利,而拿到的是3,就不能取得勝利。
而2是偶數,3是奇數,由此我們可以大膽猜測一下,是不是拿到偶數的玩家比拿到奇數的玩家勝率高。
奇數的約數只能是奇數–比如9的約數是1 3 9;15的的約數是1 3 5 15;
偶數的約數可奇可偶–比如6的約數是1 2 3 6;等等。
無論N初始爲多大的值,N的約數一定有1和它本身,那麼所有的N都可以無腦找x=1來執行。當N=2時,玩家再叫1;另一名玩家得到的N=1,就無法進行操作,所以該遊戲的終止數一定是N=2。由此可得誰可以搶到偶數這個點,無腦叫1,將對手逼到奇數,一直到N=2時就可以獲得遊戲勝利。
所以該題的關鍵點是奇偶數,判斷N爲奇數還是偶數即可;

class Solution {
    public boolean divisorGame(int N) {
    	//如果N是偶數返回ture,是奇數返回false
        return N%2==0;
    }
}

問題292:Nim遊戲
你和你的朋友,兩個人一起玩 Nim 遊戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最後一塊石頭的人就是獲勝者。你作爲先手。
你們是聰明人,每一步都是最優解。 編寫一個函數,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。

示例:

輸入: 4
輸出: false
解釋: 如果堆中有 4 塊石頭,那麼你永遠不會贏得比賽;
因爲無論你拿走 1 塊、2 塊 還是 3 塊石頭,最後一塊石頭總是會被你的朋友拿走。

問題分析:由例題可得當數量還剩4快時,無論怎樣都不會取得勝利。
該遊戲的規則是最多取3塊,最少取1塊,所以第四塊是怎麼樣都拿不到的,4這個點就有可能是取得遊戲勝利的關鍵。玩這類遊戲一定要把主動權掌握在自己手裏,我們可以將”第四塊石頭“當作最後一塊石頭,也就是不能讓對手拿到這”第四塊石頭"。首先考慮四的倍數,當我們先手時要保證石頭數量不爲四的倍數,否則主動權不在我們手中,反之可以輕易取勝。

class Solution {
    public boolean canWinNim(int n) {
    	//如果石頭個數不是四的倍數返回true,是則返回false
        return n%4!=0;
    }
}

這兩道題都是遊戲類問題,剛做時可能會覺得無從下手,因爲你沒有搞清遊戲規則,簡單分析下來,發現取勝的關鍵是一個數或者一類數,這時問題就迎刃而解,代碼也顯得很簡單明瞭。
總結:做題多動腦!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章