题目地址:
https://leetcode.com/problems/reorder-data-in-log-files/
给定一个长 n n n的字符串数组 A A A,每个字符串的结构形如 s s s + 空格 + t t t,其中 s s s不含空格, t t t要么只含字母要么只含数字(都可能含空格)。现在要求对 A A A进行排序, t t t只含字母的排在只含数字的前面,只含字母的按照 t t t字典序排序,如果一样则继续按照 s s s字典序排序;只含数字的按在 A A A中的顺序排序。
开两个列表,一个存 t t t只含字母的,另一个存只含数字的。前者开成字符串数组为元素的列表,对其排序的时候只需要按照数组第二个元素排就可以了。最后结果就是两个列表的拼接。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public String[] reorderLogFiles(String[] logs) {
List<String[]> letterList = new ArrayList<>();
List<String> digitList = new ArrayList<>();
for (String log : logs) {
for (int i = 0; i < log.length(); i++) {
// 第一次遇到空格的时候就进行分割
if (log.charAt(i) == ' ') {
if (Character.isLetter(log.charAt(i + 1))) {
letterList.add(new String[]{log.substring(0, i), log.substring(i + 1)});
} else {
digitList.add(log);
}
// 分割完就退出循环
break;
}
}
}
letterList.sort((l1, l2) -> {
int comp = l1[1].compareTo(l2[1]);
if (comp != 0) {
return comp;
} else {
return l1[0].compareTo(l2[0]);
}
});
String[] res = new String[logs.length];
for (int i = 0; i < res.length; i++) {
if (i < letterList.size()) {
String[] strs = letterList.get(i);
res[i] = strs[0] + " " + strs[1];
} else {
res[i] = digitList.get(i - letterList.size());
}
}
return res;
}
}
时间复杂度 O ( n l log n ) O(nl\log n) O(nllogn), l l l是最长字符串长度,空间 O ( n l ) O(nl) O(nl)。