【力扣日记】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)
发布了317 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Heart_for_Ling/article/details/105429217
今日推荐