引言
今天在刷题的时候遇到了这道题https://leetcode-cn.com/problems/reorder-log-files
。一开始的解法为:
class Solution {
/**
* 0 <= logs.length <= 100 | 3 <= logs[i].length <= 100 | logs[i] 保证有一个标识符,并且标识符后面有一个字。
* 字母日志 排前面 数字排后面且按原本顺序| 字母日志 字典序 数字原样 忽略标识符
*/
public static String[] reorderLogFiles(String[] logs) {
if(logs.length < 2) {
return logs;
}
List<String> resList = new LinkedList<>();
List<String> strList = new LinkedList<>();
for (String str : logs) {
String[] strings = str.split(" ");
char c = strings[1].charAt(0);
if ('0' <= c && c <= '9') {
resList.add(str);
}else {
strList.add(str);
}
}
strList.sort(Comparator.comparing(s -> s.split(" ", 2)[1]));
int index = 0;
for (String str : strList){
resList.add(index++,str);
}
return resList.toArray(new String[resList.size()]);
}
}
发现用时比其他人慢很多,然后开始优化。
具体看注释部分和存在部分。
class Solution {
/**
* 0 <= logs.length <= 100 | 3 <= logs[i].length <= 100 | logs[i] 保证有一个标识符,并且标识符后面有一个字。
* 字母日志 排前面 数字排后面且按原本顺序| 字母日志 字典序 数字原样 忽略标识符
*/
public static String[] reorderLogFiles(String[] logs) {
if(logs.length < 2) {
return logs;
}
List<String> resList = new LinkedList<>();
List<String> strList = new LinkedList<>();
for (String str : logs) {
// String[] strings = str.split(" ");
// char c = strings[1].charAt(0);
char c = str.charAt(str.indexOf(" ")+1);
if ('0' <= c && c <= '9') {
resList.add(str);
}else {
strList.add(str);
}
}
// strList.sort(Comparator.comparing(s -> s.split(" ", 2)[1]));
strList.sort(new Comparator<String>(){
public int compare(String s1, String s2){
String log1 = s1.substring(s1.indexOf(" "));
String log2 = s2.substring(s2.indexOf(" "));
return log1.compareTo(log2);
}
});
// int index = 0;
// for (String str : strList){
// resList.add(index++,str);
// }
strList.addAll(resList);
return strList.toArray(new String[strList.size()]);
}
}
sort那里是最后一次进行的优化。优化之后速度猛的提高了…
想想也是,你函数式编程,它还要再解释解释。
所以我大胆提高一个观点:lambda表达式在oj中会比匿名内部类慢。