算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做 Nim 游戲,我們先來看題面:https://leetcode-cn.com/problems/nim-game/You are playing the following Nim Game with your friend:Initially, there is a heap of stones on the table.
You and your friend will alternate taking turns, and you go first.
On each turn, the person whose turn it is will remove 1 to 3 stones from the heap.
The one who removes the last stone is the winner.
Given n, the number of stones in the heap, return true if you can win the game assuming both you and your friend play optimally, otherwise return false.
桌子上有一堆石頭。
你們輪流進行自己的回合,你作為先手。
每一回合,輪到的人拿掉 1 - 3 塊石頭。
拿掉最后一塊石頭的人就是獲勝者。
假設(shè)你們每一步都是最優(yōu)解。請編寫一個函數(shù),來判斷你是否可以在給定石頭數(shù)量為 n 的情況下贏得游戲。如果可以贏,返回 true;否則,返回 false 。
示例
示例 1:
輸入:n = 4
輸出:false
解釋:如果堆中有 4 塊石頭,那么你永遠不會贏得比賽;
因為無論你拿走 1 塊、2 塊 還是 3 塊石頭,最后一塊石頭總是會被你的朋友拿走。
示例 2:
輸入:n = 1
輸出:true
示例 3:
輸入:n = 2
輸出:true
解題
有史以來最少代碼量的解法,雖然解法很簡單,但是題目還是蠻有意思的,題目說給我們一堆石子,每次可以拿一個兩個或三個,兩個人輪流拿,拿到最后一個石子的人獲勝,現(xiàn)在給我們一堆石子的個數(shù),問我們能不能贏。那么我們就從最開始分析,由于是我們先拿,那么3個以內(nèi)(包括3個)的石子,我們直接贏,如果共4個,那么我們一定輸,因為不管我們?nèi)讉€,下一個人一次都能取完。如果共5個,我們贏,因為我們可以取一個,然后變成4個讓別人取,根據(jù)上面的分析我們贏,所以我們列出1到10個的情況如下:
1.Win
2.Win
3.Win
4.Lost
5.Win
6.Win
7.Win
8.Lost
9.Win
10.Win
由此我們可以發(fā)現(xiàn)規(guī)律,只要是4的倍數(shù)個,我們一定會輸,所以對4取余即可class Solution {
public boolean canWinNim(int n) {
return n % 4 != 0;
}
}
好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動力 。