面試官:祖瑪遊戲玩過麼?我來拷拷你~

2021-02-15 力扣加加
題目地址(488. 祖瑪遊戲)

https://leetcode-cn.com/problems/zuma-game/

題目描述
回憶一下祖瑪遊戲。現在桌上有一串球,顏色有紅色(R),黃色(Y),藍色(B),綠色(G),還有白色(W)。 現在你手裡也有幾個球。

每一次,你可以從手裡的球選一個,然後把這個球插入到一串球中的某個位置上(包括最左端,最右端)。接著,如果有出現三個或者三個以上顏色相同的球相連的話,就把它們移除掉。重複這一步驟直到桌上所有的球都被移除。

找到插入並可以移除掉桌上所有球所需的最少的球數。如果不能移除桌上所有的球,輸出 -1 。

示例:
輸入: "WRRBBW", "RB"
輸出: -1
解釋: WRRBBW -> WRR[R]BBW -> WBBW -> WBB[B]W -> WW (翻譯者標註:手上球已經用完,桌上還剩兩個球無法消除,返回-1)

輸入: "WWRRBBWW", "WRBRW"
輸出: 2
解釋: WWRRBBWW -> WWRR[R]BBWW -> WWBBWW -> WWBB[B]WW -> WWWW -> empty

輸入:"G", "GGGGG"
輸出: 2
解釋: G -> G[G] -> GG[G] -> empty

輸入: "RBYYBBRRB", "YRBGB"
輸出: 3
解釋: RBYYBBRRB -> RBYY[Y]BBRRB -> RBBBRRB -> RRRB -> B -> B[B] -> BB[B] -> empty
標註:

你可以假設桌上一開始的球中,不會有三個及三個以上顏色相同且連著的球。
桌上的球不會超過20個,輸入的數據中代表這些球的字符串的名字是 "board" 。
你手中的球不會超過5個,輸入的數據中代表這些球的字符串的名字是 "hand"。
輸入的兩個字符串均為非空字符串,且只包含字符 'R','Y','B','G','W'。


前置知識公司思路

面試題困難難度的題目常見的題型有:

本題就是遊戲類題目。如果你是一個前端, 說不定還會考察你如何實現一個 zuma 遊戲。這種遊戲類的題目,可以簡單可以困難, 比如力扣經典的石子遊戲,寶石遊戲等。這類題目沒有固定的解法。我做這種題目的思路就是先暴力模擬,再嘗試優化算法瓶頸。

注意下數據範圍球的數目 <= 5,因此暴力法就變得可行。基本思路是暴力枚舉手上的球可以消除的地方, 我們可以使用回溯法來完成暴力枚舉的過程,在回溯過程記錄最小值即可。由於回溯樹的深度不會超過 5,因此這種解法應該可以 AC。

上面提到的可以消除的地方,指的是「連續相同顏色 + 手上相同顏色的球大於等於 3」,這也是題目說明的消除條件。

因此我們只需要兩個指針記錄連續相同顏色球的位置,如果可以消除,消除即可。

如圖,我們記錄了連續紅球的位置, 如果手上有紅球, 則可以嘗試將其清除,這一次決策就是回溯樹(決策樹)的一個分支。之後我們會撤回到這個決策分支, 嘗試其他可行的決策分支。

以 board = RRBBRR , hand 為 RRBB 為例,其決策樹為:

其中虛線表示無需手動幹預,系統自動消除。葉子節點末尾的黃色表示全部消除需要的手球個數。路徑上的文字後面的數字表示此次消除需要的手球個數

如果你對回溯不熟悉,可以參考下我之前寫的幾篇題解:比如 46.permutations[1]。

可以看出, 如果選擇先消除中間的藍色,則只需要一步即可完成。

關於計算連續球位置的核心代碼(Python3):

i = 0
while i < len(board):
    j = i + 1
    while j < len(board) and board[i] == board[j]: j += 1
    # 其他邏輯

    # 更新左指針
    i = j

具體算法:

用哈希表存儲手上的球的種類和個數,這麼做是為了後面「快速判斷連續的球是否可以被消除」。由於題目限制手上求不會超過 5,因此哈希表的最大容量就是 5,可以認為這是一個常數的空間。

回溯。

2.1 確認可以消除的位置,算法參考上面的代碼。

2.2 判斷手上是否有足夠相同顏色的球可以消除。

2.3 回溯的過程記錄全局最小值。

代碼

代碼支持:Python3

Python3 Code:

class Solution:
    def findMinStep(self, board: str, hand: str) -> int:
        def backtrack(board):
            if not board: return 0
            i = 0
            ans = 6
            while i < len(board):
                j = i + 1
                while j < len(board) and board[i] == board[j]: j += 1
                balls = 3 - (j - i)
                if counter[board[i]] >= balls:
                    balls = max(0, balls)
                    counter[board[i]] -= balls
                    ans = min(ans, balls + backtrack(board[:i] + board[j:]))
                    counter[board[i]] += balls
                i = j
            return ans

        counter = collections.Counter(hand)
        ans = backtrack(board)
        return -1 if ans > 5 else ans

「複雜度分析」

時間複雜度:

更多算法套路可以訪問我的 LeetCode 題解倉庫:https://github.com/azl397985856/leetcode 。目前已經 36K star 啦。大家也可以關注我的公眾號《力扣加加》帶你啃下算法這塊硬骨頭。


Reference[1] 

46.permutations: https://github.com/azl397985856/leetcode/blob/master/problems/46.permutations.md

1、算法萌新如何學好動態規劃(第一彈)

2、字節跳動的算法面試題是什麼難度?

3、字節跳動的算法面試題是什麼難度?(第二彈)

4、【西法帶你學算法】一次搞定前綴和

5、用最優雅的方式打開終端

相關焦點

  • 別白跑了,元大昌零拷冬釀酒停售!原因竟然是……
    零拷冬釀酒暫停儘管如此,元大昌還是下架了所有零拷冬釀酒!而「江南春」就是釀製零拷冬釀酒的公司!@無敵王果子喝著排長隊拷來的冬釀酒,配著冬至夜肥美鹹香的滷菜羊糕,熱炒冷盤葷素滿滿一桌,吃得心滿意足暖意橫生,這就是冬至夜的最高配置。
  • 從 "�" 到 "錕斤拷",這都是些啥玩意?
    為什麼會出現「錕斤拷」?我們接著來看, 如下圖所示,仍然從 「程序猿石頭」 對應二進位編碼截取部分:在中文系統中,常見的字符編碼是 GBK,這個時候,因為大家沒提前商量清楚,我就默認按照 GBK 給你編碼看看。
  • 3K玩神秘開年大作,神廟祖瑪-探秘金字塔
    、遊戲樂趣全升級、滿載埃及神秘風格的《神廟祖瑪-探秘金字塔》國內獨家代理權,旨在用這款經典祖瑪玩法加神秘埃及風格元素的手遊大作打響開年第一炮!3K玩作為於2014年成功發行了單機手遊精品《歡樂泡泡貓》的發行公司,使該遊戲先後進駐「單機手遊雙百計劃」,斬獲「2014百度最具創新單機手遊」、「最具營銷運營獎」等多種榮譽。3K玩一貫根據遊戲品質來選擇發行產品,此次相當看重這款產品的祖瑪遊戲精髓和獨特埃及神秘風格元素,旨在將祖瑪系列遊戲煥發全新風採!
  • 面試官:我兒子是你兒子的爸爸,我是你的誰?美女精闢回答
    無論是在什麼公司什麼部門擔任著什麼工作職務前都要經歷最重要的一個環節,就是要和面試官談話,達到雙向標準,一個是公司方考慮著要不要應聘和面試方要不要受聘。在面試的時候總是會出現一些一個又一個讓人費勁腦汁的問題。
  • 效果拔群:日本網友視頻面試緊張,竟把面試官「魔改」成遊戲攻略對象!
    同樣的如果要找工作,大多數情況下也是靠視頻面試的方式。視頻面試就是跟對方公司約好時間,打開電腦跟通訊軟體,開始面試、敘述學習經歷,了解對方公司跟工作情況等等。對於應聘者來說,視頻面試是一個全面展示自己的好機會。除了過人的能力以外,種種細節也都是視頻面試取勝的關鍵。
  • 女面試官:我兒子叫你兒子爸爸,那我是你的誰?小夥神回復被錄取
    如今面試已經不像以前那樣,只問一些簡單的基礎知識來考察求職者的能力,面試官還會出一些看上去「沒頭腦」,實則考驗求職者應變能力的問題。
  • 一勺花生醬、一塊腐乳照樣「拷」!這家老字號零拷店藏著上海人「小辰光」的味道|十分上海·歲月特輯
    新民晚報「上海時刻」出品上午9時,轉角的櫃檯剛開門,已有市民排起隊來。「味道正宗,品質有保證,想吃多少就買多少。」市民大多因此而來。 老顧客們都會自帶容器,因為「零拷」方便衛生、兼顧環保。 田老伯特地從寶山趕來,手裡的搪瓷杯、搪瓷碗已裝滿了醬料。他喜歡饅頭蘸著辣醬吃,40多年來口味已經養成。
  • 女面試官:我沒穿衣服被你看到,會怎麼做?畢業大學生高情商回答
    面試官在面試他們三個的時候採用了集體面試的形式,本來到這個階段只需要幾個考核思維能力的問題就可以,但他們三個的回答都天衣無疑,竟讓女面試官作難了,於是女面試官靜靜的想了會,又問出了一個問題:我沒穿衣服被你看到,你會怎麼做?
  • Google面試官:不給我留提問時間,怎麼給你 hire?
    反思之後,應該是由於做題太慢,有幾輪只回答了一道題,面試官沒有時間 follow up。加面的情況今年很常見,有加面design,也有加面BQ的,不過像Google這樣加面3輪Coding的卻不多見。如果面試表現不好,FB一般不會直接掛你,很多情況是給你加面機會或者down level。FB 的Coding環節,面試官一般會準備兩道題。這時候如果你只是完美地做出一道題,基本上這輪就跪了。相反,你快速解決兩道題,即便有些小瑕疵,說不定也能過。
  • 女面試官:「一口吃掉牛尾巴」是什麼字?高材生機智回答,直接被錄取
    面試的時候,這位面試官就出了這樣的一道題:一口吃掉牛尾巴,是個什麼字?這時候第一位回答的是一位90後的姑娘,當她聽到這道題的時候,自己都懵了,她沒有想到這位面試官會出這樣的題,她對這種猜字謎的遊戲也是一點也不懂,於是就讓面試官希望能夠出一些其它問題讓她回答
  • 面試官:成語字典有幾個成語?小姑娘機智回答,被錄取
    就像小編在寫的文章來說,也會用到很多的成語,比如說網友們經常調侃小編的就是,寫的亂七八糟,思路毫無邏輯,甚至有的讀者都會對小編我有破口大罵的前奏了。不過在這裡小編要說一下的是,小編的水平有限,我也是在一點點的成長,希望自己能夠成長的更快一些,讓自己能寫出更多,更更優質的文章來,供大家們閱讀。
  • 面試官:猴子摘桃,打一成語?女大學生回答不出被淘汰
    ,往往面試官出的一些題,讓他們大多都感到很奇葩,很多時候都回答不上來,而最近一位女大學生小美參加了一家公司的面試,結果,面試官出了一道題:猴子摘桃,打一成語?  這時,走來一位面試官,直接領著三位來到了公司的會議室,看了三位的個人簡歷以後,於是,出了幾道理論知識,剛好女大學生小美就是理科專業畢業的,所以,很快就把問題給回答出來了,面試官看三位回答的都很好。
  • 面試官: 爸爸給20元讓你去買42元的中華煙, 幽默男孩回答被錄用
    在面試中不僅要掌握專業的知識技能,還要有隨機應變的能力,不然你永遠都不知道面試官下一句問你什麼。所謂道高一尺魔高一丈,在面試中表現的淋漓盡致。在一場面試中,考官就提出了這樣的問題:爸爸給你20塊錢,讓你去買42元的中華煙,你怎麼買?平常都是給考官買煙,這次成給爸爸買煙了,不知道面試官葫蘆裡賣的什麼藥。讓我們看看面試者怎麼回答的吧。
  • 職業移民面試官刁難?律師:英語要過關
    關注"北美e生活" 或 "uslifezs"關注我們,每天收到你意想不到的好文     有華人表示,美國移民官要求背出社安號,還詢問年收入金額,移民官的態度與口氣也十分不友善。對此,移民律師認為,現在刁難案件增多,意在考驗申請人的英語程度,問題也會針對申請人,當時辦理綠卡途徑的方式而有所不同,尤其對透過職業移民申請綠卡或入籍的面試為最嚴。
  • 面試官:請問,鉛筆姓什麼?回「鉛」的都淘汰,小姑娘巧妙作答!
    中了面試官的套路。很多面試官喜歡一些心思細膩,思維活躍的求職者們。對於這些公司來說,學歷,專業知識只是他們的門檻而已,頭腦靈活,遇事能夠應變自如的人,才是公司們想要的人才,要知道專業知識是可以培養的,然而思維邏輯方式,臨場應變能力這些可是無法培養的!餘力今年25歲,是一名典型的「90後」。從工作了一年的原公司離職後,他參加了某公司的面試,應聘銷售助理崗位。
  • 面試官: 李字去掉子, 是什麼字? 答「木」被落選, 男孩機智被錄取
    主要也是為了讓公司挑選到更好更合適的人才,只要你了解到面試官們想要什麼答案,那就能勝人一步。我就有這麼一位朋友阿傑,他在面試時被問到了這樣一個問題:李字去掉子,是什麼字?結果和他一起面試回答「木」的其他人全部遭到了淘汰,這也讓他反思面試官為啥要問這個問題,最後回答讓他通過了錄取。
  • 女面試官:「饕餮」這兩個字怎麼念?美女機智回答,被錄取
    對於求職者來說最重要的事情就是面試,很多小細節會起到決定性的作用。偶爾我們會在面試時碰上有些奇葩的問題。這些問題總是都讓我們頗感意外,卻能考驗出你的隨機應變能力。HR們會從這些奇奇怪怪的問題中看到員工的能力。
  • 面試官:什麼字是全世界通用的?博士答英文,卻當場被淘汰
    很快,他就收到了面試邀約。他準備了一晚上,就去面試地點了。面試官在簡單地了解了一些面試者的基礎資料後,問了一個奇怪的問題:什麼字是全世界通用的?這麼嚴肅的場所,面試官怎麼會問這樣的問題呢?但是很快,大家神色就恢復自然了。郭富城思量了一番,就先舉手回答了:"現在全世界通用的字當然就是英文了。雖然據調查,使用英文的人其實還是沒有中文多,但是英文依舊是全世界通用的語言。"郭富城覺得自己回答的已經足夠完善了,但是面試官給他的表情卻讓他覺得他沒戲了。接下來,回答問題的是一個大學畢業的小夥子。
  • 4個老外應聘外教,差點被面試官搞哭……
    ► 資歷豐富的4個老外去應聘外教,他們通過了嚴苛的層層篩選,最終進入到考核的最後一關,結果碰到了這輩子也沒遇到過的面試官當他們視頻連線看到面試官時……因為,每個人的面試官竟然都是——孩子!策劃這條有趣視頻的是在線少兒教育領導品牌 VIPKID,之所以讓孩子來面試外教,是因為他們相信:外教好不好,孩子說了算!
  • 美女面試官:世界上筆畫最多的字是什麼?研究生回復「龘」被淘汰
    張智霖也是和收到一家大型公司的面試邀請,經過一番準備,張智霖也是去到了這家公司。去到後,面試官同時面試了好幾個面試者,問了一個這樣的問題,讓幾個人都是有點不知道該怎麼回答。美女面試官問道:「世界上筆畫最多的字是什麼?」