原题链接在这里:https://leetcode.com/problems/reorder-data-in-log-files/
题目:
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: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"] Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]
Constraints:
0 <= logs.length <= 100
3 <= logs[i].length <= 100
logs[i]
is guaranteed to have an identifier, and a word after the identifier.
题解:
Sort the logs.
When both are letters, sort based on the second part.
If need to flip, lamda return 1.
Time Complexity: O(nlogn*m). n = logs.length. m = average length.
Space: O(1).
AC Java:
1 class Solution { 2 public String[] reorderLogFiles(String[] logs) { 3 if(logs == null || logs.length == 0){ 4 return logs; 5 } 6 7 Arrays.sort(logs, (a, b) -> { 8 String [] sa = a.split("\\s+", 2); 9 String [] sb = b.split("\\s+", 2); 10 11 boolean isDigita = Character.isDigit(sa[1].charAt(0)); 12 boolean isDigitb = Character.isDigit(sb[1].charAt(0)); 13 14 if(!isDigita && !isDigitb){ 15 int com = sa[1].compareTo(sb[1]); 16 if(com == 0){ 17 return sa[0].compareTo(sb[0]); 18 } 19 20 return com; 21 }else if(isDigita && isDigitb){ 22 return 0; 23 }else if(isDigita && !isDigitb){ 24 // flip when a is digit and b is letter 25 return 1; 26 }else{ 27 return -1; 28 } 29 }); 30 31 return logs; 32 } 33 }