重新排列日志文件
难度:
标签:
题目描述
代码结果
运行时间: 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)
代码细节讲解
🦆
如何确保在分割日志时正确地将标识符与后续内容分开,特别是当日志内容中也包含空格时?
▷🦆
在使用`isdigit()`函数判断日志类型时,是否存在对标识符部分也进行了检查的可能性?如何避免这种情况?
▷🦆
题解中提到使用TimSort进行排序,为什么选择使用这种排序方法,它与其他排序方法相比有何优势?
▷🦆
在对字母日志排序后进行重新组合时,有哪些可能的边界情况需要考虑,例如日志分割后的部分为空如何处理?
▷