zoukankan      html  css  js  c++  java
  • [LeetCode] 937. 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.

    重新排列日志文件。分两种日志,一种是字母日志,一种是数字日志。每个日志的第一个单词决定了他到底是字母日志还是数字日志,请按如下规则对日志排序。

    • 所有 字母日志 都排在 数字日志 之前。
    • 字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序;
    • 数字日志 应该按原来的顺序排列。

    思路是需要自己写comparator函数。

    时间O(nlogn)

    空间O(n)

    Java实现

     1 class Solution {
     2     public String[] reorderLogFiles(String[] logs) {
     3         List<String> llogs = new ArrayList<>();
     4         List<String> dlogs = new ArrayList<>();
     5         for (String log : logs) {
     6             int i = log.indexOf(" ");
     7             char ch = log.charAt(i + 1);
     8             if (ch >= '0' && ch <= '9') {
     9                 dlogs.add(log);
    10             } else {
    11                 llogs.add(log);
    12             }
    13         }
    14         Collections.sort(llogs, new Comparator<String>() {
    15             @Override
    16             public int compare(String s1, String s2) {
    17                 int index1 = s1.indexOf(" ");
    18                 String id1 = s1.substring(0, index1);
    19                 String letter1 = s1.substring(index1 + 1);
    20                 int index2 = s2.indexOf(" ");
    21                 String id2 = s2.substring(0, index2);
    22                 String letter2 = s2.substring(index2 + 1);
    23                 int v1 = letter1.compareTo(letter2);
    24                 if (v1 != 0) {
    25                     return v1;
    26                 }
    27                 int v2 = id1.compareTo(id2);
    28                 return v2;
    29             }
    30         });
    31         String[] res = new String[llogs.size() + dlogs.size()];
    32         int i = 0;
    33         for (String s : llogs) {
    34             res[i++] = s;
    35         }
    36         for (String s : dlogs) {
    37             res[i++] = s;
    38         }
    39         return res;
    40     }
    41 }

    LeetCode 题目总结

  • 相关阅读:
    MySQL 一次非常有意思的SQL优化经历:从30248.271s到0.001s
    Oracle 11g 自动收集统计信息
    C# 获取当前方法的名称空间、类名和方法名称
    C# 数值的隐式转换
    C# using 三种使用方式
    C#、Unity 数据类型的默认值
    Unity for VsCode
    C# Lambda
    git push以后GitHub上文件夹灰色 不可点击
    C#保留小数
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13064674.html
Copyright © 2011-2022 走看看