iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
自我挑戰組

leetcode 30天 不中斷解題挑戰系列 第 25

Day25 leetcode weekly contest 314

  • 分享至 

  • xImage
  •  

首先是 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)

以上為今天的練習感謝大家


上一篇
Day24 leetcode隨機挑題(Slide、Prefix sum)
下一篇
Day26 leetcode隨機選題 (String、Two Pointer、GCD)
系列文
leetcode 30天 不中斷解題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言