937. 重新排列日志文件
题目:请按下述规则将日志重新排序:
所有 字母日志 都排在 数字日志 之前。
字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序;
数字日志 应该按原来的顺序排列。
思路:将数字和字母日志分别放于两个list中,对字母list进行排序后将数字日志加入到字母list中
代码:
class Solution {
public String[] reorderLogFiles(String[] logs) {
List
List
//将数字日志和字母日志分别放入numLogs和letLogs中
for (String s:logs) {
if(Character.isDigit(s.charAt(s.indexOf(' ')+1))) {
numLogs.add(s);
} else{
letLogs.add(s);
}
}
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
// TODO Auto-generated method stub
int res = s1.substring(s1.indexOf(' ')+1, s1.length()).compareTo(s2.substring(s2.indexOf(' ')+1, s2.length()));
return res==0?s1.substring(0,s1.indexOf(' ')).compareTo(s2.substring(0,s2.indexOf(' '))):res;
}
};
Collections.sort(letLogs,comparator);
letLogs.addAll(numLogs);
return letLogs.toArray(new String[letLogs.size()]);
}
}
高端写法:
class Solution {
public String[] reorderLogFiles(String[] logs) {
Arrays.sort(logs, (log1, log2) -> {
String[] split1 = log1.split(" ", 2);
String[] split2 = log2.split(" ", 2);
boolean isDigit1 = Character.isDigit(split1[1].charAt(0));
boolean isDigit2 = Character.isDigit(split2[1].charAt(0));
if (!isDigit1 && !isDigit2) {
int cmp = split1[1].compareTo(split2[1]);
if (cmp != 0) return cmp;
return split1[0].compareTo(split2[0]);
}
return isDigit1 ? (isDigit2 ? 0 : 1) : -1;
});
return logs;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/reorder-data-in-log-files/solution/zhong-xin-pai-lie-ri-zhi-wen-jian-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号