LeetCode.937-重新排序日誌數組(Reorder Log Files)

這是悅樂書的第358次更新,第385篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第220題(順位題號是937)。你有一系列日誌。每個日誌都是以空格分隔的單詞串。

每個日誌中的第一個單詞是標識符,由字母數字組成。

字母日誌,標識符後面的每個單詞只包含小寫字母。
數字日誌,標識符後面的每個單詞只包含數字。

每個日誌在其標識符後至少有一個單詞。

重新排序日誌,以便所有字母日誌都在任何數字日誌之前。字母日誌按字典順序排序,忽略標識符,在特定的情況下使用標識符。數字日誌應按其原始順序排列。返回日誌數組的最終順序。例如:

輸入:["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"]

輸入:["a1 9 2 3 1", "g1 act car", "zo4 4 7", "ab1 act car", "a8 act car"]
輸出:["a8 act car", "ab1 act car", "g1 act car", "a1 9 2 3 1", "zo4 4 7"]

注意

  • 0 <= logs.length <= 100

  • 3 <= logs [i] .length <= 100

  • logs[i]保證有標識符,標識符後面有一個單詞。

02 第一種解法

題目的意思是給一個字符串數組,每個字符串可以分爲字母字符串、數字字符串,按照下面的規則排序:

  • 所有字母字符串排在前,數字字符串排在後。

  • 如果是數字字符串,依舊還按照原來的順序排。

而字母字符串的排序規則如下:

  • 字母字符串除去標誌位後,按剩下的字符串的字典順序排序,即小的字母在前,大的字母在後。

  • 如果所有字符串除去標誌位後,他們剩下的字符串全都相等,那麼就需要按照標誌位來排序,標誌位也按照字典順序來排,依舊是小的字母在前,大的字母在後。

我們可以先將數組中所有的元素區分出來,分別存入兩個List中,再對其中只存字母日誌的List進行排序,而根據上面這些排序規則,我們可以重寫compare方法,通過實現Comparator接口來完成,因爲我們使用了List,所以我們排序方法需要使用Collectionssort方法。

public String[] reorderLogFiles(String[] logs) {
    List<String> list = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();
    for (String log : logs) {
        String[] tem = log.split(" ");
        if (Character.isLetter(tem[1].charAt(0))) {
            list.add(log);
        } else {
            list2.add(log);
        }
    }
    // 排序
    Comparator<String> com = new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            int index = o1.indexOf(' ');
            int index2 = o2.indexOf(' ');
            // 標誌位
            String flag = o1.substring(0, index);
            String flag2 = o2.substring(0, index2);
            // 標誌位後面的字符串
            String left = o1.substring(index+1);
            String left2 = o2.substring(index2+1);
            // 先比較標誌位後面的字符串
            int tem = left.compareTo(left2);
            // 如果標誌位後面的字符串都相等,就比較標誌位
            return tem == 0 ? flag.compareTo(flag2) : tem ;
        }

    };
    Collections.sort(list, com);
    list.addAll(list2);
    return list.toArray(new String[list.size()]);
}


03 第二種解法

對於第一種解法,我們也可以直接實現Comparator接口,重寫compare方法,思路都是一樣的。

public String[] reorderLogFiles2(String[] logs) {
    Comparator<String> com = new Comparator<String>() {
        @Override
        public int compare(String s, String s2) {
            String[] arr = s.split(" ");
            String[] arr2 = s2.split(" ");
            boolean isDigit = Character.isDigit(arr[1].charAt(0));
            boolean isDigit2 = Character.isDigit(arr2[1].charAt(0));
            // 都是字母
            if (!isDigit && !isDigit2) {
                int tem = s.substring(s.indexOf(' ')+1).compareTo(s2.substring(s2.indexOf(' ')+1));
                if (tem == 0) {
                    return arr[0].compareTo(arr2[0]);
                }
                return tem;
            }
            return isDigit ? (isDigit2 ? 0 : 1) : -1;
        }
    };
    Arrays.sort(logs, com);
    return logs;
}

04 小結

算法專題目前已連續日更超過七個月,算法題文章226+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章