题目:
在这里插入代码片你有一个日志数组 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"]
源码:
class Solution {
public String[] reorderLogFiles(String[] logs) {
if (logs.length <= 1) {
return logs;
}
// num 用来添加数字标识符
List<String> num = new ArrayList<>();
// letter 用来添加字母标识符
List<String> letter = new ArrayList<>();
for (String str : logs) {
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ') {
if (str.charAt(i + 1) >= '0'
&& str.charAt(i + 1) <= '9') {
num.add(str); // 加入数字标识符的队列
} else {
letter.add(str); // 加入字母标识符的队列
}
break;
}
}
}
// 将字母标识符队列里面的 String 进行字母有序排序
Collections.sort(letter, new Comparator<String>() {
public int compare(String s1, String s2) {
int i = 0;
int j = 0;
for (; i < s1.length(); i++) {
if (s1.charAt(i) == ' ') {
i += 1;
break;
}
}
for (; j < s2.length(); j++) {
if (s2.charAt(j) == ' ') {
j += 1;
break;
}
}
int k = s1.substring(i).compareTo(s2.substring(j));
if (k == 0) {
// 此处表示标识符后面的内容相同
// 那么就按照标识符排序
return s1.substring(0, i - 1).
compareTo(s2.substring(0, j - 1));
}
return k;
}
});
// 最后将字母和数字标识符部分都添加到一个新的字符串数组中
int m = 0;
String[] newStr = new String[logs.length];
for (String tmp : letter) {
newStr[m++] = tmp;
}
for (String tmp2 : num) {
newStr[m++] = tmp2;
}
return newStr;
}
}