題目描述
你有一個日誌數組 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)