这是悦乐书的第358次更新,第385篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第220题(顺位题号是937)。你有一系列日志。每个日志都是以空格分隔的单词串。

每个日志中的第一个单词是标识符,由字母数字组成。

字母日志,标识符后面的每个单词只包含小写字母。

数字日志,标识符后面的每个单词只包含数字。

每个日志在其标识符后至少有一个单词。

重新排序日志,以便所有字母日志都在任何数字日志之前。字母日志按字典顺序排序,忽略标识符,在特定的情况下使用标识符。数字日志应按其原始顺序排列。返回日志数组的最终顺序。例如:

输入:["a1 9 2 3 1", "g1 act car", "zo4 4 7", "ab1 off key dog", "a8 act zoo"]

输出:["g1 act car", "a8 act zoo", "ab1 off key dog", "a1 9 2 3 1", "zo4 4 7"]

输入:["a1 9 2 3 1", "g1 act car", "zo4 4 7", "ab1 act car", "a8 act car"]

输出:["a8 act car", "ab1 act car", "g1 act car", "a1 9 2 3 1", "zo4 4 7"]

注意

  • 0 <= logs.length <= 100

  • 3 <= logs [i] .length <= 100

  • logs[i]保证有标识符,标识符后面有一个单词。

02 第一种解法

题目的意思是给一个字符串数组,每个字符串可以分为字母字符串、数字字符串,按照下面的规则排序:

  • 所有字母字符串排在前,数字字符串排在后。

  • 如果是数字字符串,依旧还按照原来的顺序排。

而字母字符串的排序规则如下:

  • 字母字符串除去标志位后,按剩下的字符串的字典顺序排序,即小的字母在前,大的字母在后。

  • 如果所有字符串除去标志位后,他们剩下的字符串全都相等,那么就需要按照标志位来排序,标志位也按照字典顺序来排,依旧是小的字母在前,大的字母在后。

我们可以先将数组中所有的元素区分出来,分别存入两个List中,再对其中只存字母日志的List进行排序,而根据上面这些排序规则,我们可以重写compare方法,通过实现Comparator接口来完成,因为我们使用了List,所以我们排序方法需要使用Collectionssort方法。

public String[] reorderLogFiles(String[] logs) {
List<String> list = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
for (String log : logs) {
String[] tem = log.split(" ");
if (Character.isLetter(tem[1].charAt(0))) {
list.add(log);
} else {
list2.add(log);
}
}
// 排序
Comparator<String> com = new Comparator<String>() { @Override
public int compare(String o1, String o2) {
int index = o1.indexOf(' ');
int index2 = o2.indexOf(' ');
// 标志位
String flag = o1.substring(0, index);
String flag2 = o2.substring(0, index2);
// 标志位后面的字符串
String left = o1.substring(index+1);
String left2 = o2.substring(index2+1);
// 先比较标志位后面的字符串
int tem = left.compareTo(left2);
// 如果标志位后面的字符串都相等,就比较标志位
return tem == 0 ? flag.compareTo(flag2) : tem ;
} };
Collections.sort(list, com);
list.addAll(list2);
return list.toArray(new String[list.size()]);
}

03 第二种解法

对于第一种解法,我们也可以直接实现Comparator接口,重写compare方法,思路都是一样的。

public String[] reorderLogFiles2(String[] logs) {
Comparator<String> com = new Comparator<String>() {
@Override
public int compare(String s, String s2) {
String[] arr = s.split(" ");
String[] arr2 = s2.split(" ");
boolean isDigit = Character.isDigit(arr[1].charAt(0));
boolean isDigit2 = Character.isDigit(arr2[1].charAt(0));
// 都是字母
if (!isDigit && !isDigit2) {
int tem = s.substring(s.indexOf(' ')+1).compareTo(s2.substring(s2.indexOf(' ')+1));
if (tem == 0) {
return arr[0].compareTo(arr2[0]);
}
return tem;
}
return isDigit ? (isDigit2 ? 0 : 1) : -1;
}
};
Arrays.sort(logs, com);
return logs;
}

04 小结

算法专题目前已连续日更超过七个月,算法题文章226+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.937-重新排序日志数组(Reorder Log Files)的更多相关文章

  1. [Swift]LeetCode937. 重新排列日志文件 | Reorder Log Files

    You have an array of logs.  Each log is a space delimited string of words. For each log, the first w ...

  2. 【Leetcode_easy】937. Reorder Log Files

    problem 937. Reorder Log Files solution: class Solution { public: vector<string> reorderLogFil ...

  3. 【LeetCode】Reorder Log Files(重新排列日志文件)

    这道题是LeetCode里的第937道题. 题目描述: 你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写 ...

  4. Leetcode937. Reorder Log Files重新排列日志文件

    你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写字母组成,或: 标识符后面的每个字将仅由数字组成. 我们 ...

  5. LeetCode 937 Reorder Log Files 解题报告

    题目要求 You have an array of logs.  Each log is a space delimited string of words. For each log, the fi ...

  6. 【leetcode】937. Reorder Log Files

    题目如下: You have an array of logs.  Each log is a space delimited string of words. For each log, the f ...

  7. 【LeetCode】937. Reorder Log Files 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 分割和排序 日期 题目地址:https://leet ...

  8. leecode 937 Reorder Log Files (模拟)

    传送门:点我 You have an array of logs.  Each log is a space delimited string of words. For each log, the ...

  9. 937. Reorder Log Files

    You have an array of logs.  Each log is a space delimited string of words. For each log, the first w ...

随机推荐

  1. win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结

    win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结 一:前提 注意:现在有两种安装的方式 1. oracle11g服务端(64位)+oracle客户端(32位)+plsql(3 ...

  2. js获取前几个月的具体日期

    // 往前数monthNum月份,不能往后数monthNum getPreMonthDay("2018-12-28",20) // 往前数monthNum月份,不能往后数month ...

  3. 【洛谷P2147】洞穴勘测

    题目大意:维护 N 个点的无向图,支持动态加边和删边,回答两点的连通性. 题解:线段树分治 + 可撤销并查集 询问可以离线,这是线段树分治的基础. 建立在操作时间轴上的线段树称为线段树分治算法. 本题 ...

  4. mysql数据库之表操作及字段约束条件

    目录 一.存储引擎 二.表介绍 三.创建表 四.查看表结构 五.数据类型 一.介绍 二.数值类型 整数类型 浮点型 三.字符串类型 四.日期类型 五.枚举类型与集合类型 六.约束条件 七.修改表 al ...

  5. Java多线程和并发(一),进程与线程的区别

    目录 1.进程和线程的由来 2.进程和线程的定义 3.进程和线程的区别 一.进程和线程的区别 1.进程和线程的由来 2.进程和线程的定义 进程是资源分配的最小单位,线程是CPU调度的最小单位 3.进程 ...

  6. Flyway Validate failed: Migration checksum mismatch for migration version 1.0.0.01 错误

    在运行系统的时候出现错误: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ...

  7. TTTTTTTTTTTTT poj 3057 Evacuation 二分图匹配+bfs

    题意:见挑战230页 #include <iostream> #include <cstdio> #include <cstring> #include <c ...

  8. luoguP1041 传染病控制 x

    P1041 传染病控制 题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染 ...

  9. 【BZOJ3944】 Sum

    Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...

  10. ant design 的表格默认选中

    在使用 ant design 的表格时候使用默认选中项, 需要配置的 Table 的 rowSelection const rowSelection = { type: 'checkbox', get ...