leetcode 937. 重新排列日誌檔案
阿新 • • 發佈:2018-12-02
你有一個日誌陣列 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"]
提示:
0 <= logs.length <= 100
3 <= logs[i].length <= 100
logs[i]
保證有一個識別符號,並且識別符號後面有一個字。
根據題意直接對陣列排序,如果是數字日誌要排到後面,對於兩個字母日誌,比較去掉識別符號的字串,用compareTo函式比較。
值得注意的是重寫Comparator的compare函式的時候,要注意三個特性:
-
自反性:x,y 的比較結果和 y,x 的比較結果相反。
-
傳遞性:x>y,y>z,則 x>z。
-
對稱性: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; } }