1. 程式人生 > >leetcode 937. 重新排列日誌檔案

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"]

 

提示:

  1. 0 <= logs.length <= 100
  2. 3 <= logs[i].length <= 100

logs[i] 保證有一個識別符號,並且識別符號後面有一個字。


根據題意直接對陣列排序,如果是數字日誌要排到後面,對於兩個字母日誌,比較去掉識別符號的字串,用compareTo函式比較。

值得注意的是重寫Comparator的compare函式的時候,要注意三個特性:

  1. 自反性:x,y 的比較結果和 y,x 的比較結果相反。

  2. 傳遞性:x>y,y>z,則 x>z。

  3. 對稱性:x=y,則 x,z 比較結果和 y,z 比較結果相同。

所以在compare函式中,兩字串相等的情況下要返回0,否則會報錯。

class Solution {
    public String[] reorderLogFiles(String[] logs) {
        Arrays.sort(logs,new Comparator<String>(){
           @Override
            public int compare(String s1,String s2){
                if(s1.equals(s2))return 0;
                int index1=s1.indexOf(' ');
                int index2=s2.indexOf(' ');
                //都是數字日誌則位置不變
                if(s1.charAt(index1+1)>='0'&&s1.charAt(index1+1)<='9'&&s2.charAt(index2+1)>='0'&&s2.charAt(index2+1)<='9')return 0;
                //s1是數字日誌,s2是字母日誌,則s1要排在s2後面
                if(s1.charAt(index1+1)>='0'&&s1.charAt(index1+1)<='9'){
                    return 1;
                }
                //s1是字母日誌,s2是數字日誌,則s2要排在s1後面
                if(s2.charAt(index2+1)>='0'&&s2.charAt(index2+1)<='9'){
                    return -1;
                }
                //兩個都是字母日誌時,則比較去掉識別符號的字串
                String sub1=s1.substring(index1);
                String sub2=s2.substring(index2);
                int cmp = sub1.compareTo(sub2);
                if(cmp<0)return -1;
                if(cmp==0)return 0;//字串相等則位置不變
                return 1;
            }
        });
        return logs;
    }
}