用 Swift 刷 Leetcode No.292 - Nim Game

轉(zhuǎn)自我的 blog: 用 Swift 刷 Leetcode No.292 - Nim Game

繼續(xù)按照難易度刷 LeetCode,這次的題目是 Nim Game(前面三個(gè)需要付費(fèi)才能解鎖……),看題目的提交者,好像還是個(gè)華人。

leetcode_292.png

看完題目,第一感覺(jué)是這種數(shù)字推理的題目需要?jiǎng)討B(tài)規(guī)劃才能解決,但是都用上動(dòng)態(tài)規(guī)劃了也不可能是個(gè) Easy 的題目啊。再想一下就想出解決方法了,靠遞歸嘛,根據(jù) n-1 來(lái)求解 n。

class Solution {
    var round = 1
    func canWinNim(n: Int) -> Bool {
        if n < 4 {
            if round%2 == 1{
                return true
            } else {
                return false
            }
        } else {
            round += 1
            return canWinNim(n-1) || canWinNim(n-2) || canWinNim(n-3)
        }
    }
}

試了幾個(gè) case,都沒(méi)問(wèn)題,就猛擊 Submit Solution 了。據(jù)我的個(gè)人經(jīng)驗(yàn),第一次遞交是不可能通過(guò)的,果不其然,敗在了一個(gè)大數(shù)上:

error.png

難道這個(gè)數(shù)字有什么特殊的嗎?1348820612這個(gè)數(shù)字并沒(méi)有超過(guò) Int32.max 啊。我在 Playground 中執(zhí)行這個(gè)數(shù)字的 case,果然也沒(méi)有執(zhí)行成功,得到了 error: Playground execution aborted: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2, address=0x7fff5ea0df98)。正好今天讀完了喵神的「Swifter」,立刻想到了這可能是因?yàn)檫f歸爆棧了,但我嘗試了用定義內(nèi)部函數(shù)也未果。

最好實(shí)在沒(méi)辦法了,看了這道題的 Discuss,不看不知道啊,原來(lái)這道題的正確解法只有一句代碼。許多人和我一樣,也是想利用遞歸來(lái)解題,而且無(wú)論什么語(yǔ)言只要是用遞歸的都敗在了1348820612這個(gè)數(shù)字上。再看各種 one-line-solution,正像有的人說(shuō)的那樣,這并不是一道算法題,而是一個(gè)數(shù)學(xué)題(wiki),在這里提供一個(gè)其他blog的參考。

正確解法是:

class Solution {
    func canWinNim(n: Int) -> Bool {
        return n%4 != 0
    }
}

而其他可以通過(guò)的解法,都是判斷是否能整除4的變種。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,896評(píng)論 0 33
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,367評(píng)論 2 36
  • leetcode刷題記錄本文記錄一下leetcode刷題記錄,記錄一下自己的解法和心得。 LeetCode Two...
    EarthChen閱讀 3,599評(píng)論 0 6
  • 雖然刷題一直飽受詬病,不過(guò)不可否認(rèn)刷題確實(shí)能鍛煉我們的編程能力,相信每個(gè)認(rèn)真刷題的人都會(huì)有體會(huì)。現(xiàn)在提供在線(xiàn)編程評(píng)...
    selfboot閱讀 59,289評(píng)論 15 88
  • 前言 為什么要用 Swift 刷 leetcode?因?yàn)槲矣袃蓚€(gè)想法,一是學(xué) Swift 并且有機(jī)會(huì)練練,二是想把...
    戴倉(cāng)薯閱讀 2,625評(píng)論 5 21

友情鏈接更多精彩內(nèi)容