前言
Weekly Contest 110的第一题 重新排列日志文件:
你有一个日志数组
logs
。每条日志都是以空格分隔的字串。对于每条日志,其第一个字为字母数字标识符。然后,要么:
- 标识符后面的每个字将仅由小写字母组成,或;
- 标识符后面的每个字将仅由数字组成。
我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。
将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按字母顺序排序,忽略标识符,标识符仅用于表示关系。数字日志应该按原来的顺序排列。
返回日志的最终顺序
示例:
输入:["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"] 输出:["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
提示:
0 <= logs.length <= 100
3 <= logs[i].length <= 100
logs[i]
保证有一个标识符,并且标识符后面有一个字。
解题思路
本题主要麻烦的地方是题目的描述有点难懂,其实是一道很简单的题目。
首先分析题目中对于日志、字母日志和数字日志的定义:
-
日志:指的是日志文件(本题中为字符串数组)中的一行记录,记录的内容为用空格分隔的字符串(后续称为单词),需要注意第一个单词是标识符用于排序。即
标识符 单词1 [单词2 ...]
。 - 字母日志:指的是日志内容除了标识符部分外的单词都由字母组成
- 数字日志:指的是日志内容除了标识符部分外的单词都由数字组成
然后分析题目意思,得出字符串数组的处理思路:
- 对日志进行分组,分为字母日志和数字日志
- 字母日志重排序
- 字母日志和数字日志聚合日志数据
实现代码
/**
* 937. 重新排列日志文件
* @param logs
* @return
*/
public String[] reorderLogFiles(String[] logs) {
List<String> letterLogs=new LinkedList<>();
List<String> digitLogs=new LinkedList<>();
//日志分组
for(String log:logs){
char c=log.charAt(log.indexOf(" ")+1);
if(c>=48 && c<=57){//是否包含数字
digitLogs.add(log);
}else{
letterLogs.add(log);
}
}
//字母日志排序
letterLogs.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {//只比较日志内容
String log1=o1.substring(o1.indexOf(" "));
String log2=o2.substring(o2.indexOf(" "));
return log1.compareTo(log2);
}
});
//聚合日志
letterLogs.addAll(digitLogs);
return letterLogs.toArray(logs);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。