LeetCode 937. Reorder Data in Log Files

原题链接在这里: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:

  1. 0 <= logs.length <= 100
  2. 3 <= logs[i].length <= 100
  3. 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 }

猜你喜欢

转载自www.cnblogs.com/Dylan-Java-NYC/p/12171410.html