题目描述
你有一个日志数组 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)