這是悅樂書的第358次更新,第385篇原創 <br/>java
01 看題和準備
今天介紹的是LeetCode
算法題中Easy
級別的第220
題(順位題號是937
)。你有一系列日誌。每一個日誌都是以空格分隔的單詞串。git
每一個日誌中的第一個單詞是標識符,由字母數字組成。算法
字母日誌,標識符後面的每一個單詞只包含小寫字母。 數字日誌,標識符後面的每一個單詞只包含數字。數組
每一個日誌在其標識符後至少有一個單詞。數據結構
從新排序日誌,以便全部字母日誌都在任何數字日誌以前。字母日誌按字典順序排序,忽略標識符,在特定的狀況下使用標識符。數字日誌應按其原始順序排列。返回日誌數組的最終順序。例如:ide
輸入:["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"]spa
輸入:["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"]日誌
注意:code
-
0 <= logs.length <= 100排序
-
3 <= logs [i] .length <= 100
-
logs[i]保證有標識符,標識符後面有一個單詞。
<br/>
02 第一種解法
題目的意思是給一個字符串數組,每一個字符串能夠分爲字母字符串、數字字符串,按照下面的規則排序:
-
全部字母字符串排在前,數字字符串排在後。
-
若是是數字字符串,依舊還按照原來的順序排。
而字母字符串的排序規則以下:
-
字母字符串除去標誌位後,按剩下的字符串的字典順序排序,即小的字母在前,大的字母在後。
-
若是全部字符串除去標誌位後,他們剩下的字符串全都相等,那麼就須要按照標誌位來排序,標誌位也按照字典順序來排,依舊是小的字母在前,大的字母在後。
咱們能夠先將數組中全部的元素區分出來,分別存入兩個List
中,再對其中只存字母日誌的List
進行排序,而根據上面這些排序規則,咱們能夠重寫compare
方法,經過實現Comparator
接口來完成,由於咱們使用了List,因此咱們排序方法須要使用Collections
的sort
方法。
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()]); }
<br/>
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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!