现在过不了了哈!当时比赛能AC,后期应该添加了新的用例,所以我的代码是不能AC的,详情参考评论,懒得再看了= =,请移步其他题解,抱歉哈。
题目链接
LeetCode 周赛 110 场A题
https://leetcode-cn.com/contest/weekly-contest-110/problems/reorder-log-files/
题意
题目很长,总之,就是给出一个字符串数组,每条字符串由空格分开,第一个空格前的子串是日志的标识符。而后面的就是日志的具体内容。日志的内容一定是2种情况:全为小写字母或者全为数字。现在要求对其排序,要求总结如下:
1.不包括标识符,也就是说排序以日志内容为准,在忽略标识符的前提下进行排序。
2.对于小写字母的日志,按照字典序进行排序。
3.对于数字的日志,不排序,但是全部放在字母日志的后面。顺序是在数组中出现的顺序。
题解
可能是考Java各种方法以及集合的题吧,感觉比B题难了,毕竟B题是看懂题意直接爆破,这个题如果对Java尤其是字符串操作方法不太熟的话可能会写得略慢。因为我们的排序是要忽略标识符的,但是同时又要求输出答案的时候保持原串不变,那么我们可以先把每个日志进行分开操作,然后把内容当成key,标识符当成value存进map里面。最后输出答案的时候再拼起来。这样,我们排序就直接对日志内容的子串进行操作就可以了。
因为字母日志与数字日志的处理是不一样的。那么我们可以用两个list集合来分别保存日志。因为我们要先遍历数组,创建map,那么在进行这一个操作的时候就可以顺便判定一下日志是字母日志还是数字日志。只用判定空格后第一个字符的范围就行了。然后获得两个list。对于数字日志不进行任何操作,而字母日志进行排序。
最后在输出答案的时候注意拼接,利用map获取标识符后再拼接内容,注意加上空格。先拼字母日志,我们也已经排序了,那么遍历得到的就是字典序,数字日志已经是正常遍历得到的顺序了,这里直接拼即可。
没有尝试直接String操作,最后拼接之类的用的是StringBuilder,不知道String会不会TLE。应该不会吧,毕竟标志也是easy,更何况数据也不多。
Java 代码
import java.util.*;
class Solution {
public String[] reorderLogFiles(String[] logs) {
HashMap<String,String> map = new HashMap<>();
ArrayList<String> arr = new ArrayList<>();
ArrayList<String> numarr = new ArrayList<>();
for(int i = 0;i < logs.length;i++){
for(int j = 0;j < logs[i].length();j++){
if(logs[i].charAt(j) == ' '){
String flag = logs[i].substring(0,j);
String key = logs[i].substring(j+1,logs[i].length());
if(key.charAt(0) >= '0' && key.charAt(0) <= '9' ){
numarr.add(key);
}else{
arr.add(key);
}
map.put(key,flag);
break;
}
}
}
Collections.sort(arr);
String[] ans = new String[logs.length];
int i = 0;
for(i = 0;i < arr.size();i++){
String value = arr.get(i);
StringBuilder sb = new StringBuilder(map.get(value));
sb.append(" "+value);
ans[i] = sb.toString();
}
for(int j = 0;j < numarr.size();j++,i++){
String value = numarr.get(j);
StringBuilder sb = new StringBuilder(map.get(value));
sb.append(" "+value);
ans[i] = sb.toString();
}
return ans;
}
}