0
点赞
收藏
分享

微信扫一扫

leetcode--937. 重新排列日志文件

云竹文斋 2022-05-03 阅读 235

题目描述:

给你一个日志数组 logs。每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 。

有两种不同类型的日志:

字母日志:除标识符之外,所有字均由小写字母组成
数字日志:除标识符之外,所有字均由数字组成
请按下述规则将日志重新排序:

所有 字母日志 都排在 数字日志 之前。
字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序。
数字日志 应该保留原来的相对顺序。
返回日志的最终顺序。

分析:

题目大意
要求我们按照特定的格式重新排序日志。

日志 的格式是第一个单词是 日志 的 标识符,后面的都是 日志 的内容。
有两种 日志,一种内容是纯数字的(数字日志),一种内容是纯英文字符的(字母日志)。

 

要求的排序规则:

把所有的英文 日志 放到数字 日志 前面。
而且如果是字母日志,需要按照内容对 日志 进行排序,当内容相同的时候按照标识符排序;
如果是数字 日志,保持原来的顺序。

 

拆分和排序
看起来题目很长,但是只要是字符串处理题,对于 python 都很简单。

我用了两个列表,分别存储字母日志和数字日志,先分别排序,再拼接到一起。

首先需要进行分割成标识符和内容;
对内容的第一个单词进行判断:
如果是英文字符串,说明是字母日志,那么把内容和标识符构成 元组 放到 letters 的列表里;
如果是数字字符串,说明是数字日志,那么直接把当前的这个日志放到 nums 列表里。
然后我们需要对 letters进行排序:因为 元组 里首先是内容,然后是标识符,所以 sort()会先对内容进行排序,然后再对标识符进行排序。
从 letters排序的结果中提取出所有的内容,并与 nums 拼接在一起,返回即可。

python代码:

class Solution(object):
    def reorderLogFiles(self, logs):
        """
        :type logs: List[str]
        :rtype: List[str]
        """
        letters = []
        nums = []
        for log in logs:
            logsplit = log.split(" ")
            if logsplit[1].isalpha():
                letters.append((" ".join(logsplit[1:]), logsplit[0]))
            else:
                nums.append(log)
        letters.sort()
        return [letter[1] + " " + letter[0] for letter in letters] + nums

c++代码:

class Solution {
public:
    vector<string> reorderLogFiles(vector<string>& logs) {
        stable_sort(logs.begin(), logs.end(), [&](const string & log1, const string & log2) {
            int pos1 = log1.find_first_of(" ");
            int pos2 = log2.find_first_of(" ");
            bool isDigit1 = isdigit(log1[pos1 + 1]);
            bool isDigit2 = isdigit(log2[pos2 + 1]);
            if (isDigit1 && isDigit2) {
                return false;
            }
            if (!isDigit1 && !isDigit2) {
                string s1 = log1.substr(pos1);
                string s2 = log2.substr(pos2);
                if (s1 != s2) {
                    return s1 < s2;
                }
                return log1 < log2;
            }
            return isDigit1 ? false : true;
        });
        return logs;
    }
};

举报

相关推荐

0 条评论