这是悦乐书的第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. python file对象测试数据的读写操作及OS模块介绍(四)

    import   from....import 引入模块 引入类 ①import 如果文件在lib下而且是python模块 :import 模块名. ②from....import from 包名.包 ...

  2. 【Linux学习四】Linux下Vim命令操作

    1.Vim介绍 Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性. 第一阶段通过vimtutor的学习,加强vim的熟练度 1.1光标移动 hjkl左 ...

  3. qt5--模态对话框和非模态对话框

    视频教程:https://www.bilibili.com/video/av51766541/?p=20 #include "win.h" #include <QMenuBa ...

  4. sublime开发工具各类配置和插件的安装

    1.css颜色提示 惯例两步: ctrl+shift+p Install package 手动输入color Highlighter 注意,一定要手动输入,复制粘贴回车会没有反应,一般手动输入colo ...

  5. [Linux系统] (4)脚本编程

    一.bash shell 可以理解为一种解释器和启动器,解释命令文本,并执行命令. 命令来源: 用户交互输入 文本文件输入 1.示例,写一个最简单的文本 vi test.txt 写入以下内容: ech ...

  6. python中assert的用法

    assert:断言 格式: assert 表达式 [, 参数] 当表达式为真时,程序继续往下执行: 当表达式为假时,抛出AssertionError错误,并将  参数  输出 举例: def foo( ...

  7. jenkins集成python的单元测试

    最近在研究jenkins的集成,然后想把自己写的python工具也用jenkins集成一下 废话少说,来看结构 sparking.py ''' @author: lianying ''' class ...

  8. 广工2017校赛-F-- tmk找三角

    http://gdutcode.sinaapp.com/problem.php?cid=1056&pid=5 Description 有一棵树,树上有只tmk.他在这棵树上生活了很久,对他的构 ...

  9. App可视化埋点技术原理大揭秘

    一.背景 运营者能够对用户行为进行分析的前提,是对大量数据的掌握.在以往,这个数据通常是由开发者在控件点击.页面等事件中,一行行地编写埋点代码来完成数据收集的.然而传统的操作模式每当升级改版时,开发和 ...

  10. hibernate 一对多单向注解配置(实现级联操作 )

    学生表关联学生的课程表(一对多) 学生表实体类: @Entity @Table(name = "JXD_COM_STUDENT") public class StudentMode ...