首先是 2432. The Employee That Worked on the Longest Task (east)
https://leetcode.com/problems/the-employee-that-worked-on-the-longest-task/
找尋最長的工作時段,並輸出該時段工作的人的ID
題目別看錯,第一次寫的時候以為是要輸出工作時長最長的,結果答案整個都錯的zzzz
想法:
就跟一般找最大值的概念一樣,變成儲存ID罷了,算是loop+list的基本題吧
class Solution:
#leaveTime 是嚴格遞增:也就是說不是24hr制
#我還以為是要記錄每個員工的工作時間,這啥題==
def hardestWorker(self, n: int, logs: List[List[int]]) -> int:
minList = logs[0]
for i in range(1,len(logs)):
# print(minList)
if logs[i][1] - logs[i-1][1]>minList[1]:
minList = [logs[i][0],logs[i][1] - logs[i-1][1]]
elif logs[i][1] - logs[i-1][1]==minList[1] and logs[i][0]<minList[0]:
minList = [logs[i][0],logs[i][1] - logs[i-1][1]]
return minList[0]
再來是 2433. Find The Original Array of Prefix Xor (medium)
https://leetcode.com/problems/find-the-original-array-of-prefix-xor/
給一串經過 prefix-xor 的數列,反推原數列。
想法:
就跟給一個prefix sum的數列處理一樣,反算回去即可
class Solution:
#給答案反推回去
def findArray(self, pref: List[int]) -> List[int]:
ans = []
for i in range(-1,-len(pref),-1):
ans.append(pref[i]^pref[i-1])
ans.append(pref[0])
return ans[::-1]
再來是 2434. Using a Robot to Print the Lexicographically Smallest String (medium)
給一個字串s,有兩種指令:
指令1:把s字串第一個字母移到字串t的最後面
指令2:把t字串的最後一個字母移到p的最後面
要求找出p的最小字典排序
想法:
原理很簡單,因為t最後一個字母會是優先移到p的,所以先檢查s是否有比t最後一個更小的,有的話不能移,反之就移。
我這邊當時在寫的時候趕時間,所以直接用Counter處理,沒管時間複雜度
class Solution:
#當字後面有更小的數字,就必須得將他丟到t
#用dict的方法確認後面有沒有更小的東西,但老實說有點慢
#一開始想到的方法
def robotWithString(self, s: str) -> str:
t,ans = [],[]
sC = Counter(s)
for i in s:
sC[i] -= 1
if sC[i] == 0:
del sC[i]
t.append(i)
while t and sC and t[-1] <= min(sC):
ans.append(t.pop())
ans += t[::-1]
ans = "".join(ans)
return ans
以下稍微優化過
class Solution:
#直接把最小的字母記錄在表單上,就不用每次都要比大小
def robotWithString(self, s: str) -> int:
t,ans = [],[]
sL = len(s)
minTable = [s[-1]]*sL#紀錄表,表示該位置時最小的字母
for i in range(sL - 2, -1, -1):
minTable[i] = min(s[i], minTable[i + 1])
for i in range(len(s)):
t.append(s[i])
while i + 1 < sL and t and minTable[i + 1] >= t[-1]:
ans += t.pop()
ans += t[::-1]
return ''.join(ans)
以上為今天的練習感謝大家