Re: [閒聊] 每日leetcode

看板Marginalman作者 (caster )時間1年前 (2024/08/19 16:02), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串738/1548 (看更多)
※ 引述《JerryChungYC (JerryChung)》之銘言: : https://leetcode.com/problems/2-keys-keyboard : 650. 2 Keys Keyboard : 一開始有一個 'A' 在記事本中,有兩種操作方式 : 複製全部:將目前所有文字複製 : 貼上 :將複製的文字貼上 : 給一個數字 n ,求獲得 n 個 'A' 最少要進行的步驟次數 : Example 1: : Input: n = 3 : Output: 3 : Explanation: 一開始有一個 'A' : Step 1, 複製 : Step 2, 貼上 得到 'AA' : Step 3, 貼上 得到 'AAA' : Example 2: : Input: n = 1 : Output: 0 : Constraints: : 1 <= n <= 1000 : 思路: : 知道在做什麼但沒有想法 所以先從小數字實際算一次找規律 : 結果發現似乎是質因數加總的答案 於是就直接go : 如 12 = 2 * 2 * 3 , 2 + 2 + 3 = 7 答案就是 7 : 如 8 = 2 * 2 * 2 , 2 + 2 + 2 = 6 答案 6 (cpcpcp) or (cpcppp) : Python Code: : class Solution: : def minSteps(self, n: int) -> int: : ans = 0 # [] : while n % 2 == 0: : ans += 2 # append : n //= 2 : for i in range(3, int(n**0.5) + 1, 2): : while n % i == 0: : ans += i # append : n //= i : if n > 2: : ans += n # append : return ans # sum() : 原本用 list 存質因數 最後再用 sum : 不過直接進行加總好像更好 : 所以這題的原理是啥 思路: 一開始copy的值是1 假設(目標n - 現在長度) % 現在長度 == 0 代表我們能將copy值換成現在長度 因為現在長度>現在copy值 所以能更快將字串長度變成n 而且(目標n - 現在長度) % 現在長度 == 0 所以現在長度能剛好走完剩餘距離 不會超過n 所以符合假設就將現在copy值變成現在長度 也就是說 重新copy 然後貼上 假如不符合假設 就現在copy值繼續貼上 Python Code: class Solution: def minSteps(self, n: int) -> int: result = 0 cur_copy = 1 cur_len = 1 n -= 1 while n > 0: if n % cur_len == 0: cur_copy = cur_len n -= cur_copy cur_len += cur_len result += 2 else: cur_len += cur_copy n -= cur_copy result += 1 return result 感覺不像正確做法 但時間空間都滿漂亮的 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.117.48 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1724054556.A.AB7.html
文章代碼(AID): #1cmlmSgt (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1cmlmSgt (Marginalman)