Algorithm


Problem Name: 937. Reorder Data in Log Files

You are given an array of logs. Each log is a space-delimited string of words, where the first word is the identifier.

There are two types of logs:

  • Letter-logs: All words (except the identifier) consist of lowercase English letters.
  • Digit-logs: All words (except the identifier) consist of digits.

Reorder these logs so that:

  1. The letter-logs come before all digit-logs.
  2. The letter-logs are sorted lexicographically by their contents. If their contents are the same, then sort them lexicographically by their identifiers.
  3. The digit-logs maintain their relative ordering.

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"]
Explanation:
The letter-log contents are all different, so their ordering is "art can", "art zero", "own kit dig".
The digit-logs have a relative order of "dig1 8 1 5 1", "dig2 3 6".

Example 2:

Input: logs = ["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"]

 

Constraints:

  • 1 <= logs.length <= 100
  • 3 <= logs[i].length <= 100
  • All the tokens of logs[i] are separated by a single space.
  • logs[i] is guaranteed to have an identifier and at least one word after the identifier.

Code Examples

#1 Code Example with Java Programming

Code - Java Programming


class Solution {
  public String[] reorderLogFiles(String[] logs) {
    List letterLogs = new ArrayList<>();
    List < String> digitLogs = new ArrayList<>();
    for (String log : logs) {
      if (Character.isDigit(log.split("\\s+")[1].charAt(0))) {
        digitLogs.add(log);
      } else {
        letterLogs.add(log);
      }
    }
    letterLogs.sort(Comparator.comparing((String o) -> o.substring(o.indexOf(' ') + 1))
        .thenComparing(o -> o.split("\\s+")[0]));
    letterLogs.addAll(digitLogs);
    return letterLogs.toArray(new String[0]);
  }
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]

Output

x
+
cmd
["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

#2 Code Example with Javascript Programming

Code - Javascript Programming


const reorderLogFiles = function(logs) {
  const letterLog = [],
    digitLog = []
  for (let log of logs) {
    if (isNaN(log.split(' ')[1])) {
      letterLog.push(log)
    } else {
      digitLog.push(log)
    }
  }
  letterLog.sort((log1, log2) => {
    let body1 = log1.slice(log1.indexOf(' '))
    let body2 = log2.slice(log2.indexOf(' '))
    if (body1 === body2) {
      return log1.split(' ')[0] > log2.split(' ')[0] ? 1 : -1
    } else {
      return body1 > body2 ? 1 : -1
    }
  })
  return [...letterLog, ...digitLog]
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]

Output

x
+
cmd
["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

#3 Code Example with Python Programming

Code - Python Programming


class Solution:
    def reorderLogFiles(self, logs):
        return sorted(filter(lambda l: l[l.find(" ") + 1].isalpha(), logs), key = lambda x: (x[x.find(" "):], x[:x.find(" ")])) + list(filter(lambda l: l[l.find(" ") + 1].isdigit(), logs))
Copy The Code & Try With Live Editor

Input

x
+
cmd
logs = ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]

Output

x
+
cmd
["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]

#4 Code Example with C# Programming

Code - C# Programming


using System.Collections.Generic;

namespace LeetCode
{
    public class _0937_ReorderDataInLogFiles
    {
        public string[] ReorderLogFiles(string[] logs)
        {
            if (logs == null || logs.Length == 0) return new string[0];

            List < string> letterLogs = new List();
            List digitLogs = new List();
            foreach (string log in logs)
            {
                if (char.IsDigit(log[log.IndexOf(' ') + 1])) digitLogs.Add(log);
                else letterLogs.Add(log);
            }

            letterLogs.Sort((a, b) =>
            {
                string sub1 = a.Substring(a.IndexOf(' ') + 1);
                string sub2 = b.Substring(b.IndexOf(' ') + 1);

                int result = sub1.CompareTo(sub2);
                if (result == 0)
                    result = a.Substring(0, a.IndexOf(' ')).CompareTo(b.Substring(0, b.IndexOf(' ')));

                return result;
            });

            letterLogs.AddRange(digitLogs);

            return letterLogs.ToArray();
        }
    }
}
Copy The Code & Try With Live Editor

Input

x
+
cmd
logs = ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]

Output

x
+
cmd
["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
Advertisements

Demonstration


Previous
#936 Leetcode Stamping The Sequence Solution in C, C++, Java, JavaScript, Python, C# Leetcode
Next
#938 Leetcode Range Sum of BST Solution in C, C++, Java, JavaScript, Python, C# Leetcode