这道题是LeetCode里的第937道题。

题目描述:

你有一个日志数组 logs。每条日志都是以空格分隔的字串。

对于每条日志,其第一个字为字母数字标识符。然后,要么:

  • 标识符后面的每个字将仅由小写字母组成,或;
  • 标识符后面的每个字将仅由数字组成。

我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。

将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按字母顺序排序,忽略标识符,标识符仅用于表示关系。数字日志应该按原来的顺序排列。

返回日志的最终顺序。

示例 :

输入:["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"]

提示:

  1. 0 <= logs.length <= 100
  2. 3 <= logs[i].length <= 100
  3. logs[i] 保证有一个标识符,并且标识符后面有一个字。

题目的意思很简单,但是由于处理的是字符串,处理起来就会相对的麻烦一些。

首先我们先要用一个 List 结构来保存日志的文章开头下标,即除去标识符和一个空格,例如:日志 "a1 9 2 3 1" 我们保存它的下标为3,其它的日志也是相同的道理。保存后在转成一个 Object[] 数组,因为对 List 不是很熟练而且 List 不支持下标访问,所以使用了这个方法来简化后面的操作。然后就是排序了,我这里使用的排序方法类似于插入排序:就是抽取一本日志,然后在把这本日志合适的插入已经排好序的日志堆里。排序遍历的时候需要注意的几个问题:

  • 拿到的日志是那种日志
  • 日志插在哪个位置才合适
  • 要如何处理逻辑关系

解题代码:

class Solution {
public static String[] reorderLogFiles(String[] logs){
List<Integer>recodeIndex = new ArrayList<>(); for(String log : logs) {
for(int i = 0;i < log.length(); i++) {
if(log.charAt(i) == ' ') {
recodeIndex.add(i + 1);
break;
}
}
} Object[] recode = recodeIndex.toArray(); for(int i = 0; i < logs.length; i++) {//遍历logs
if(logs[i].charAt((int) recode[i])>='0'&&logs[i].charAt((int) recode[i])<='9')continue;
int insert = i;
int numCount = 0;
for(int j = 0; j < i; j++) {//遍历已排序好的logs
if(logs[j].charAt((int) recode[j])>='0'&&logs[j].charAt((int) recode[j])<='9')
{numCount++;continue;}//判断是否为数字日志 int len = logs[j].length();//另一本日志的长度
int sortIndex = (int) recode[j];//另一本日志的开头位置
for(int k = (int) recode[i]; k < logs[i].length(); k++) {//寻找插入位
if(len < k || logs[i].charAt(k) > logs[j].charAt(sortIndex)){break;}
else if(logs[i].charAt(k) == logs[j].charAt(sortIndex)) {sortIndex++;continue;}
else {insert = j;break;}
}
if(insert < i)break;
} int tempIndex = recodeIndex.get(i);
String temp = new String(logs[i]);
for(int l = i;l > insert - numCount; l--) {
logs[l] = logs[l - 1];
recode[l] = recode[l - 1];
}
logs[insert - numCount] = temp;//同时不要忘记交换对应的日志开头下标数组
recode[insert - numCount] = tempIndex;
} return logs;
}
}

解题结果:

过程感悟:

我在编写算法的过程中一部分时间浪费在忘记处理 recode 数组上了,调试后才发现问题,在一个就是交换的 for 循环的循环次数和上下界,当时由于代码的逻辑混乱造成了一些失误,现在的代码是我简化后的结果,当然可以再次简化。或许这道题可以使用哈希表或者队列来解决。

附记:lambda表达式

【LeetCode】Reorder Log Files(重新排列日志文件)的更多相关文章

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

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

  2. 【Leetcode_easy】937. Reorder Log Files

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

  3. Linux /var/log下的各种日志文件详解

    1)/var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. 2)/var/log/wtmp:记录登录这的信息记录,被编码过,所以必须以 ...

  4. java最简单实现Log打印和生成日志文件

    导包 1.commons-logging.jar包 下载 2.log4j.jar包 下载 配置log4j 1.在src根目录下创建一个log4j.properties文件. 文件全部内容如下: log ...

  5. [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 ...

  6. LeetCode.937-重新排序日志数组(Reorder Log Files)

    这是悦乐书的第358次更新,第385篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第220题(顺位题号是937).你有一系列日志.每个日志都是以空格分隔的单词串. 每个日 ...

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

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

  8. 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 ...

  9. 【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 ...

随机推荐

  1. C#入门笔记3 表达式及运算符

    C#表达式 表达式,把变量.字面值与运算符组合起来,就创建表达式,是计算的基本构件.字面值:是源代码中键入的数字.字符串,表示指定类型的值.常用有几种:整数.实数.字符.字符串. 整数字面量[也能使用 ...

  2. [问题解决]Deepin环境变量设置无效解决

    将环境变量的设置放在这里:  gedit ~/.bashrc 详见参考: linux下如何设置环境变量PATH : http://blog.csdn.net/witsmakemen/article/d ...

  3. 学习express(一)

    菜鸟教程简介:Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一 ...

  4. 19/03/04 vue基础整理,webpack基础整理

    gitUrl : https://gitee.com/jinyujiang/vue_basis_example.git (迭代更新) webpack : 有道云笔记分享  以及码云(迭代更新)

  5. SQL Server 2008 转换为 SQL 2005 数据库 脚本生成

    Tips: 本文讨论如何把数据库从SQL Server 2008版本降低到2005,因为在本地开发是以SQL Server 2008 Express Edition版本进行的,而主机提供商现在提供的M ...

  6. 【转】Create Hello-JNI with Android Studio

    [转]Create Hello-JNI with Android Studio From:https://codelabs.developers.google.com/codelabs/android ...

  7. MyBatis插入数据之后返回插入记录的id

    MyBatis插入数据的时候,返回该记录的id<insert id="insert" keyProperty="id" useGeneratedKeys= ...

  8. 微软OneDrive使用体验

    OneDrive是微软推出的一款软件,提供类似百度网盘的功能,能够在线存储照片和文档, 号称从任意电脑.Mac 电脑或手机都可访问. 一起来看看吧,第一次用之前需要进行简单配置. 因为是一个同步盘,需 ...

  9. Codeforces Round #316 (Div. 2) C Replacement 扫描法

    先扫描一遍得到每个位置向后连续的'.'的长度,包含自身,然后在扫一遍求出初始的合并次数. 对于询问,只要对应位置判断一下是不是'.',以及周围的情况. #include<bits/stdc++. ...

  10. Java加腾讯云实现短信验证码功能

    一.概要 现如今在日常工作和生活中短信验证码对于我们来说是非常熟悉的,比较常见的注册账号或者交易支付时候,手机会收到一个短信验证码,我们可以通过验证码来有效验证身份,避免一些信息被盗. 验证身份 目前 ...