LeetCode:937.重新排列日志文件

题目:

在这里插入代码片你有一个日志数组 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;
    }
}
发布了340 篇原创文章 · 获赞 2 · 访问量 8301

猜你喜欢

转载自blog.csdn.net/qq_45239139/article/details/104011481