1. 程式人生 > >LeetCode 937 reorder log files 重新排列日誌檔案

LeetCode 937 reorder log files 重新排列日誌檔案

題目連結

LeetCode 周賽 110 場A題

https://leetcode-cn.com/contest/weekly-contest-110/problems/reorder-log-files/

題意

        題目很長,總之,就是給出一個字串陣列,每條字串由空格分開,第一個空格前的子串是日誌的識別符號。而後面的就是日誌的具體內容。日誌的內容一定是2種情況:全為小寫字母或者全為數字。現在要求對其排序,要求總結如下:

1.不包括識別符號,也就是說排序以日誌內容為準,在忽略識別符號的前提下進行排序。

2.對於小寫字母的日誌,按照字典序進行排序。

3.對於數字的日誌,不排序,但是全部放在字母日誌的後面。順序是在陣列中出現的順序。

題解

        可能是考Java各種方法以及集合的題吧,感覺比B題難了,畢竟B題是看懂題意直接爆破,這個題如果對Java尤其是字串操作方法不太熟的話可能會寫得略慢。因為我們的排序是要忽略識別符號的,但是同時又要求輸出答案的時候保持原串不變,那麼我們可以先把每個日誌進行分開操作,然後把內容當成key,識別符號當成value存進map裡面。最後輸出答案的時候再拼起來。這樣,我們排序就直接對日誌內容的子串進行操作就可以了。

        因為字母日誌與數字日誌的處理是不一樣的。那麼我們可以用兩個list集合來分別儲存日誌。因為我們要先遍歷陣列,建立map,那麼在進行這一個操作的時候就可以順便判定一下日誌是字母日誌還是數字日誌。只用判定空格後第一個字元的範圍就行了。然後獲得兩個list。對於數字日誌不進行任何操作,而字母日誌進行排序。

        最後在輸出答案的時候注意拼接,利用map獲取識別符號後再拼接內容,注意加上空格。先拼字母日誌,我們也已經排序了,那麼遍歷得到的就是字典序,數字日誌已經是正常遍歷得到的順序了,這裡直接拼即可。

        沒有嘗試直接String操作,最後拼接之類的用的是StringBuilder,不知道String會不會TLE。應該不會吧,畢竟標誌也是easy,更何況資料也不多。

Java 程式碼

import java.util.*;

class Solution {
    public String[] reorderLogFiles(String[] logs) {
        HashMap<String,String> map = new HashMap<>();
        ArrayList<String> arr = new ArrayList<>();
        ArrayList<String> numarr = new ArrayList<>();
        for(int i = 0;i < logs.length;i++){
            for(int j = 0;j < logs[i].length();j++){
                if(logs[i].charAt(j) == ' '){
                    String flag = logs[i].substring(0,j);
                    String key = logs[i].substring(j+1,logs[i].length());
                    if(key.charAt(0) >= '0' && key.charAt(0) <= '9' ){
                        numarr.add(key);
                    }else{
                        arr.add(key);
                    }
                    map.put(key,flag);
                    break;
                }
            }
        }
        Collections.sort(arr);
        String[] ans = new String[logs.length];
        int i = 0;
        for(i = 0;i < arr.size();i++){
            String value = arr.get(i);
            StringBuilder sb = new StringBuilder(map.get(value));
            sb.append(" "+value);
            ans[i] = sb.toString();
        }
        for(int j = 0;j < numarr.size();j++,i++){
            String value = numarr.get(j);
            StringBuilder sb = new StringBuilder(map.get(value));
            sb.append(" "+value);
            ans[i] = sb.toString();
        }
        return ans;
    }
}