LeetCode刷題記錄——第293題(Nim遊戲)
題目描述
你和你的朋友,兩個人一起玩 Nim遊戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最後一塊石頭的人就是獲勝者。你作為先手。
你們是聰明人,每一步都是最優解。 編寫一個函式,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。
示例:
輸入: 4
輸出: false
解釋: 如果堆中有 4 塊石頭,那麼你永遠不會贏得比賽;
因為無論你拿走 1 塊、2 塊 還是 3 塊石頭,最後一塊石頭總是會被你的朋友拿走。
思路分析
- 我作為先手,優勝策略是:保證我拿之後剩下的全是4的倍數才能獲勝,如果我面對的是4的倍數個石頭的話,那麼我不可能獲勝因為我一次拿不完4個,對方通過後拿總可以將石頭的個數保持4的倍數,最後一輪輪到我拿的時候,還剩四個,我一次性拿不完,朋友穩贏。
程式碼示例
class Solution:
def canWinNim(self, n):
"""
:type n: int
:rtype: bool
"""
return n%4 != 0
相關推薦
LeetCode刷題記錄——第293題(Nim遊戲)
題目描述 你和你的朋友,兩個人一起玩 Nim遊戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最後一塊石頭的人就是獲勝者。你作為先手。 你們是聰明人,每一步都是最優解。 編寫一個函式,來判斷你是否可以在給定石頭數量的情況下贏得遊戲。 示例: 輸入
LeetCode刷題記錄——第389題(找不同)
題目描述 給定兩個字串 s 和 t,它們只包含小寫字母。 字串 t 由字串 s 隨機重排,然後在隨機位置新增一個字母。 請找出在 t 中被新增的字母。 示例: 輸入: s = “abcd” t = “abcde” 輸出: e 解釋:
LeetCode刷題記錄——第387題(字串中的第一個唯一字元)
題目描述 給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。 案例: s = “leetcode” 返回 0. s = “loveleetcode”, 返回 2. 思路分析 關鍵問題在於,如何找到第一個不重複字元
LeetCode刷題記錄——第383題(贖金信)
題目描述 給定一個贖金信 (ransom) 字串和一個雜誌(magazine)字串,判斷第一個字串ransom能不能由第二個字串magazines裡面的字元構成。如果可以構成,返回 true ;否則返回 false。 (題目說明:為了不暴露贖金信字跡,要從雜誌上搜索各個需要的字母
LeetCode刷題記錄——第374題(猜數字大小)
題目描述 我們正在玩一個猜數字遊戲。 遊戲規則如下: 我從 1 到 n 選擇一個數字。 你需要猜我選擇了哪個數字。 每次你猜錯了,我會告訴你這個數字是大了還是小了。 你呼叫一個預先定義好的介面 guess(int num),它會返回 3 個可能的結果(-1,1 或 0):
LeetCode刷題記錄——第367題(有效的完全平方數)
題目描述 給定一個正整數 num,編寫一個函式,如果 num 是一個完全平方數,則返回 True,否則返回 False。 說明:不要使用任何內建的庫函式,如 sqrt。 示例 1: 輸入:16 輸出:True 示例 2: 輸入:14 輸出:F
LeetCode刷題記錄——第350題(兩個陣列的交集 II)
題目描述 給定兩個陣列,編寫一個函式來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2,2] 示例 2: 輸入: nums1 = [4,9,5], nums2 = [9,4,9,
LeetCode刷題記錄——第349題(兩個陣列的交集)
題目描述 給定兩個陣列,編寫一個函式來計算它們的交集。 示例 1: 輸入: nums1 = [1,2,2,1], nums2 = [2,2] 輸出: [2] 示例 2: 輸入: nums1 = [4,9,5], nums2 = [9,4,9,8,
LeetCode刷題記錄——第345題(反轉字串中母音字母)
題目描述 編寫一個函式,以字串作為輸入,反轉該字串中的母音字母。 示例 1: 輸入: “hello” 輸出: “holle” 示例 2: 輸入: “leetcode” 輸出: “leotcede” 思路分析 將所有母音字母放
LeetCode刷題記錄——第342題(4的冪)
給定一個整數 (32 位有符號整數),請編寫一個函式來判斷它是否是 4 的冪次方。 示例 1: 輸入: 16 輸出: true 示例 2: 輸入: 5 輸出: false 思路分析 跟3的冪一模一樣的啦,詳情請見之前的部落格
LeetCode刷題記錄——第326題(3的冪)
題目描述 給定一個整數,寫一個函式來判斷它是否是 3 的冪次方。 示例 1: 輸入: 27 輸出: true 示例 2: 輸入: 0 輸出: false 示例 3: 輸入: 9 輸出: true 示例 4:
LeetCode刷題記錄——第303題(區域和檢索 - 陣列不可變)
題目描述 給定一個整數陣列 nums,求出陣列從索引 i 到 j (i ≤ j) 範圍內元素的總和,包含 i, j 兩點。 示例: 給定 nums = [-2, 0, 3, -5, 2, -1],求和函式為 sumRange() sumRange(0, 2) ->
LeetCode刷題記錄——第290題(單詞模式)
題目描述 給定一種 pattern(模式) 和一個字串 str ,判斷 str 是否遵循相同的模式。 這裡的遵循指完全匹配,例如, pattern 裡的每個字母和字串 str 中的每個非空單詞之間存在著雙向連線的對應模式。 示例1: 輸入: pattern = “
LeetCode刷題記錄——第283題(移動零)
題目描述 給定一個數組 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。 示例: 輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0] 說明: 必須在原陣列上操作,不能拷貝額外的陣列。 儘量減少操作次數。 思
LeetCode刷題記錄——第268題(缺失數字)
題目描述 給定一個包含 0, 1, 2, …, n 中 n 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。 示例 1: 輸入: [3,0,1] 輸出: 2 示例 2: 輸入: [9,6,4,2,3,5,7,0,1] 輸出: 8
LeetCode刷題記錄——第263題(醜數)
題目描述 編寫一個程式判斷給定的數是否為醜數。 醜數就是隻包含質因數 2, 3, 5 的正整數。 示例 1: 輸入: 6 輸出: true 解釋: 6 = 2 × 3 示例 2: 輸入: 8 輸出: true 解釋: 8 = 2 × 2 ×
LeetCode刷題記錄——第258題(各位相加)
題目描述 給定一個非負整數 num,反覆將各個位上的數字相加,直到結果為一位數。 示例: 輸入: 38 輸出: 2 解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由於 2 是一位數,所以返回 2。 思路分析 很明顯,需要
LeetCode刷題記錄——第219題(存在重複元素II)
題目描述 給定一個整數陣列和一個整數 k,判斷陣列中是否存在兩個不同的索引 i i i 和
做題記錄:P2024 食物鏈(洛谷)
節點 找到 find merge 如果 div clas spa blank P2024 食物鏈 /*思路:並查集,因為一開始我們並不知道每一只動物是哪一個種類的, 所以我們幹脆建立三倍於n的空間,1~n這三分之一用來存第i只動物是A 的情況,n+1~2n這三分之一用來存
【HDOJ5996】dingyeye loves stone(Nim遊戲)
題意:dingyeye喜歡和你玩石子游戲。dingyeye有一棵n個節點的有根樹,節點編號為0到n−1,根為0號節點。 遊戲開始時,第i個節點上有a[i]個石子。兩位玩家輪流操作,每次操作玩家可以選擇一個節點,並將該節點上的一些石子(個數不能為0)移動到它的父親節點上去。 如果輪到某位玩家時,該玩家沒有任