leetcode
leetcode 851 ~ 900
重新排列日志文件

重新排列日志文件

难度:

标签:

题目描述

代码结果

运行时间: 21 ms, 内存: 16.1 MB


/*
 * 思路:
 * 1. 使用Stream对日志进行分类和排序。
 * 2. 将字母日志和数字日志分开处理,最后合并结果。
 */

import java.util.*;
import java.util.stream.Collectors;

public class LogReorderStream {
    public String[] reorderLogFiles(String[] logs) {
        List<String> letterLogs = Arrays.stream(logs)
            .filter(log -> !Character.isDigit(log.split(" ")[1].charAt(0)))
            .sorted((log1, log2) -> {
                String logBody1 = log1.substring(log1.indexOf(' ') + 1);
                String logBody2 = log2.substring(log2.indexOf(' ') + 1);
                int cmp = logBody1.compareTo(logBody2);
                if (cmp != 0) return cmp;
                return log1.compareTo(log2);
            })
            .collect(Collectors.toList());

        List<String> digitLogs = Arrays.stream(logs)
            .filter(log -> Character.isDigit(log.split(" ")[1].charAt(0)))
            .collect(Collectors.toList());

        letterLogs.addAll(digitLogs);
        return letterLogs.toArray(new String[0]);
    }
}

解释

方法:

题解首先将日志分为字母日志和数字日志两类。字母日志根据其内容先排序,若内容相同则根据标识符排序;数字日志则保持原始顺序。最终输出时,将排序后的字母日志与未改变顺序的数字日志合并输出。

时间复杂度:

O(n log n)

空间复杂度:

O(n)

代码细节讲解

🦆
如何确保在分割日志时正确地将标识符与后续内容分开,特别是当日志内容中也包含空格时?
为确保正确分割日志,应使用`split`方法时限定`maxsplit`参数为1。这样,即使日志内容中包含空格,`split(' ', 1)`也只会在第一个空格处分割字符串,从而将日志分为标识符和内容两部分。标识符为第一部分,剩余的全部内容(包括可能的空格)将作为第二部分。
🦆
在使用`isdigit()`函数判断日志类型时,是否存在对标识符部分也进行了检查的可能性?如何避免这种情况?
使用`isdigit()`函数时,应确保仅对日志的内容部分(非标识符)进行检查。在题解中,通过`split(' ')`后,`parts[1]`指的是内容的第一个元素。如果日志正确地按照格式分割,这种方法通常有效。但更保险的方式是使用`split(' ', 1)`并检查返回数组的第二个元素(即内容部分)。这样可以避免误将标识符当作内容处理。
🦆
题解中提到使用TimSort进行排序,为什么选择使用这种排序方法,它与其他排序方法相比有何优势?
TimSort是Python内置排序方法`sort()`的实现基础,它是一种稳定的排序算法,特别适用于部分已排序的数据。TimSort的优势在于它结合了归并排序和插入排序的优点,具有很好的最坏情况时间复杂度O(n log n)。对于字母日志这种可能具有部分顺序的数据,TimSort能够提供高效且稳定的性能。
🦆
在对字母日志排序后进行重新组合时,有哪些可能的边界情况需要考虑,例如日志分割后的部分为空如何处理?
在重新组合时,一个边界情况是日志内容完全为空。按照`split(' ', 1)`方法,如果日志仅包含标识符而无内容,则分割结果将有两个元素,第二个元素为空字符串。在排序和重新组合时,这种情况应被保留而不被丢弃,确保日志的完整性。此外,如果日志列表本身为空或所有日志都是数字日志,确保代码能正确处理这些情况,避免运行时错误。

相关问题