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