LeetCode.937-重新排序日志数组(Reorder Log Files)
这是悦乐书的第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,所以我们排序方法需要使用Collections
的sort
方法。
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)的更多相关文章
- [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 ...
- 【Leetcode_easy】937. Reorder Log Files
problem 937. Reorder Log Files solution: class Solution { public: vector<string> reorderLogFil ...
- 【LeetCode】Reorder Log Files(重新排列日志文件)
这道题是LeetCode里的第937道题. 题目描述: 你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写 ...
- Leetcode937. Reorder Log Files重新排列日志文件
你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写字母组成,或: 标识符后面的每个字将仅由数字组成. 我们 ...
- 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 ...
- 【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 ...
- 【LeetCode】937. Reorder Log Files 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 分割和排序 日期 题目地址:https://leet ...
- leecode 937 Reorder Log Files (模拟)
传送门:点我 You have an array of logs. Each log is a space delimited string of words. For each log, the ...
- 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 ...
随机推荐
- Linux系统层级结构标准
Linux Foundation有一套标准规范: FHS: Filesystem Hierarchy[‘haɪərɑːkɪ] Standard(文件系统层级标准)目前最新的标准是2.3版本:http: ...
- PuppeteerSharp体验之旅
public static async Task<string> LogInAsync() { try { string ResultCookies = ""; //获 ...
- [深度学习] pytorch利用Datasets和DataLoader读取数据
本文简单描述如果自定义dataset,代码并未经过测试(只是说明思路),为半伪代码.所有逻辑需按自己需求另外实现: 一.分析DataLoader train_loader = DataLoader( ...
- (Java多线程系列五)守护线程
守护线程 什么是守护线程 Java中有两种线程,一种是用户线程,一种是守护线程. 当进程不存在或主线程停止,守护线程也会自动停止. class DaemonThread extends Thread ...
- Topcoder SRM 674 Div.2题解
T1 解题思路 这题应该不是很难,主要是题意理解问题. 注意给出的两个数组里映射关系已经对应好了,只要判断是否为双射即可 参考程序 #include <bits/stdc++.h> usi ...
- AcWing:246. 区间最大公约数(线段树 + 增量数组(树状数组) + 差分序列)
给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d. 2.“Q l r”,表示询问 A[l],A[l ...
- 使用Hive-JDBC遇到的一些问题解决
使用Hive-JDBC遇到的一些问题解决(转) 标签(空格分隔): Hive 1,java.lang.NoClassDefFoundError: org/apache/hive/service/cli ...
- Upload-libs通关详解
Uplo ad-labs—详解 1前端验证绕过 前端验证绕过可以直接用burp万能绕过前端JS脚本 方法先上传一张jpg Burp改包然后改后缀 上传成功 2Content-Type方式绕过 此绕过方 ...
- [CSP-S模拟测试]:笨小猴(随机化)
题目传送门(内部题118) 输入格式 输入第一行是一个整数$n$,意义如以上所示. 接下来有$2n+1$行,每行为两个正整数,第$i$行的两个正整数分别代表$A_i$和$B_i$. 输出格式 如果无法 ...
- 误删系统服务Task Schedule的恢复方法
cmd命令 sc query Schedule查询该服务是否存在 sc delete Schedule删除服务 sc create Schedule binpath= "C:\Windows ...