Re: [閒聊] 每日leetcode

看板Marginalman作者 (JerryChung)時間1年前 (2024/11/10 00:33), 編輯推噓0(001)
留言1則, 1人參與, 1年前最新討論串1106/1548 (看更多)
https://leetcode.com/problems/minimum-array-end 3133. Minimum Array End 有點難翻 直接講我得到的結論好了 要把 n - 1 的二進位 逐一放進 x 的二進位當中為 0 的位置 如 Example 1: n = 3, x = 4 n - 1 = 2 # 10 x = 4 # 100 x 的最右邊是 0 放入 10 的 0 第二位是 0 放入 10 的 1 沒了所以其他的就不動 變成 110 = 6 Example 2: n = 2, x = 7 n - 1 = 1 # 1 x = 7 # 111 x 的前三位都是 1 所以把 1 放在最左邊 變成 (1 111) = 15 兩個解法 一個字串解 一個位元運算 空間一樣爛 但字串解比位元運算快 為啥 Python Code: class Solution: def minEnd(self, n: int, x: int) -> int: n_rev = f'{n-1:b}'[::-1] n_len = len(n_rev) x_rev = f'{x:b}'[::-1] ans = [] cnt = 0 for i, v in enumerate(x_rev): if v == '1': ans.append(v) elif cnt < n_len: ans.append(n_rev[cnt]) # x 的部分為 '0' 時 放入 n_rev 的數 cnt += 1 else: # 代表 n_rev 都放完了 ans.append(x_rev[i:][::-1]) # 把當前位置後的反轉加入 break if cnt < n_len: ans.append(n_rev[cnt:][::-1]) # 把 x 跑完後剩下的 n 也加進去 ans.reverse() return int(''.join(ans), 2) # 反轉再轉回十進位 不知道位元運算怎麼搞只好拆成字串 哦 位元運算一樣的Code跑第二次從4ms變0ms了 跟字串解一樣了 Python Code: class Solution: def minEnd(self, n: int, x: int) -> int: z = n - 1 i = 0 while z: if x & (1 << i) == 0: # 逐位判斷是否為 0 x |= ((z & 1) << i) # 把 z 最右邊的 0/1 放進 x z >>= 1 # 丟掉一位 i += 1 return x 邊解釋邊幫自己記 不然下次看到大概已經忘記在寫甚麼了 你版大師都早早就解完 剩我墊底了 我好羨慕 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.45.20.205 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1731170029.A.326.html

11/10 00:56, 1年前 , 1F
恨bitwise 嘔嘔嘔嘔嘔
11/10 00:56, 1F
文章代碼(AID): #1dBuxjCc (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1dBuxjCc (Marginalman)