【力扣日記】937 重新排列日誌文件 | 排序函數的高階使用 | 收藏

題目描述

你有一個日誌數組 logs。每條日誌都是以空格分隔的字組成的字串。

對於每條日誌,其第一個空格前的部分爲字母數字標識符。然後,要麼:
標識符後面的每個字將僅由小寫字母組成,或;
標識符後面的每個字將僅由數字組成。

我們將這兩種日誌分別稱爲字母日誌和數字日誌。保證每個日誌在其標識符後面至少有一個字。

將日誌重新排序,使得所有字母日誌都排在數字日誌之前。字母日誌按內容字母順序排序,忽略標識符;在內容相同時,按標識符排序。數字日誌應該按原來的順序排列。

返回日誌的最終順序。

算法思路

排序函數的使用,寫一個用於排序的函數helper

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        num=[]
        alpha=[]
        for i in logs:
            i1=i.split()[1:]
            if i1[0].isalpha():alpha.append(i)
            else:num.append(i)
        def helper(s):
            i=s.split()
            s=i[1:]+[i[0]]
            return ' '.join(s)
        # alpha.sort(key=helper)
        return sorted(alpha,key=helper)+num

執行用時 :56 ms, 在所有 Python3 提交中擊敗了25.37%的用戶
內存消耗 :13.7 MB, 在所有 Python3 提交中擊敗了33.33%的用戶

IMPROVEMRNT

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        # list或string的split(a, b) 其中a爲分隔符,b爲分割次數
        # 只有一個元素的tuple,要添加“,” 以便和表達式區分
        def separate(logs):
            id_, rest = logs.split(" ", 1)
            # 這裏tuple中的第一個位置可爲0可爲1,排序是由小到大,先排序所有第一個位置爲0的場合。
            return (2, rest, id_) if rest[0].isalpha() else (3,)
        # print(sorted(logs, key = lambda x: x[3]))
        return sorted(logs, key = separate)

執行用時 :48 ms, 在所有 Python3 提交中擊敗了48.88%的用戶
內存消耗 :13.5 MB, 在所有 Python3 提交中擊敗了33.33%的用戶

在排序函數上做文章,使得可以做到對數字的日誌按原順序排序,且添加前置3,使得排在最後;對字母部分,將標識符放到日誌部分後進行排序。

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        def separate(logs):
            id_, rest = logs.split(" ", 1)
            return (2, rest, id_) if rest[0].isalpha() else (3,)
        return sorted(logs, key = separate)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章