937. Reorder Log Files
by Botao Xiao
937. Reorder Log Files
Question
You have an array of logs. Each log is a space delimited string of words.
For each log, the first word in each log is an alphanumeric identifier. Then, either:
- Each word after the identifier will consist only of lowercase letters, or;
- Each word after the identifier will consist only of digits.
We will call these two varieties of logs letter-logs and digit-logs. It is guaranteed that each log has at least one word after its identifier.
Reorder the logs so that all of the letter-logs come before any digit-log. The letter-logs are ordered lexicographically ignoring identifier, with the identifier used in case of ties. The digit-logs should be put in their original order.
Return the final order of the logs.
Example 1:
Input: ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
Output: ["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
Note:
- 0 <= logs.length <= 100
- 3 <= logs[i].length <= 100
- logs[i] is guaranteed to have an identifier, and a word after the identifier.
Thinking:
- Method 1: Comparator + Sort
    class Solution { public String[] reorderLogFiles(String[] logs) { int len = logs.length; if(len == 0) return logs; String[] result = new String[len]; List<String> numList = new ArrayList<>(); List<String> cList = new ArrayList<>(); for(String log : logs){ if(isNumber(log)) numList.add(log); else cList.add(log); } Collections.sort(cList, new Comparator<String>(){ @Override public int compare(String a, String b){ int index1 = a.indexOf(" "); int index2 = b.indexOf(" "); int cmp = a.substring(index1 + 1).compareTo(b.substring(index2 + 1)); if(cmp != 0) return cmp; return a.substring(0, index1).compareTo(b.substring(0, index2)); } }); int count = 0; for(String s: cList){ result[count++] = s; } for(String s : numList){ result[count++] = s; } return result; } private boolean isNumber(String s){ int index = s.indexOf(" "); return Character.isDigit(s.charAt(index + 1)); } }
Amazon session
class Solution {
    public String[] reorderLogFiles(String[] logs) {
        int len = logs.length;
        if(len == 0) return logs;
        String[] result = new String[len];
        List<String> numList = new ArrayList<>();
        List<String> cList = new ArrayList<>();
        for(String log : logs){
            if(isNumber(log))   numList.add(log);
            else cList.add(log);
        }
        Collections.sort(cList, new Comparator<String>(){
            @Override
             public int compare(String a, String b){
                int index1 = a.indexOf(" ");
                int index2 = b.indexOf(" ");
                int cmp = a.substring(index1 + 1).compareTo(b.substring(index2 + 1));
                if(cmp != 0) return cmp;
                return a.substring(0, index1).compareTo(b.substring(0, index2));
            }
        });
        int count = 0;
        for(String s: cList){
            result[count++] = s;
        }
        for(String s : numList){
            result[count++] = s;
        }
        return result;
    }
    private boolean isNumber(String s){
        int index = s.indexOf(" ");
        return Character.isDigit(s.charAt(index + 1));
    }
}
Subscribe via RSS
