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:

  1. Each word after the identifier will consist only of lowercase letters, or;
  2. 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));
    }
}