Leetcode 937:重新排列日志文件(最详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/84024838

你有一个日志数组 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] 保证有一个标识符,并且标识符后面有一个字。

解题思路

首先想到的解法就是现将标识符后面是字母数字的两种情况拆解开。

class Solution:
    def reorderLogFiles(self, logs):
        """
        :type logs: List[str]
        :rtype: List[str]
        """
        digit_logs, letter_logs = list(), list()
        for log in logs:
            tmp = log.split(" ")
            if tmp[1].isdigit():
                digit_logs.append(log)
            else:
                letter_logs.append(log)

        letter_logs.sort(key=lambda x:x.split(" ")[1:])
        return letter_logs + digit_logs

但是这种写法非常的丑陋,我们其实可以直接对sort函数中的key进行更好的设计。一个更好的写法

class Solution:
    def reorderLogFiles(self, logs):
        """
        :type logs: List[str]
        :rtype: List[str]
        """
        def helper(log):
            _id, rest = log.split(" ", 1)
            return (0, rest, _id) if rest[0].isalpha() else (1,)

        return sorted(logs, key=helper)

这个问题对于python来说太占优势了,使用c++的话,需要一些技巧(使用stable_sort)。

class Solution 
{
public:
    vector<string> reorderLogFiles(vector<string>& logs) 
    {
        stable_sort(logs.begin(), logs.end(), cmp);
        return logs;
    }
private:
    static bool cmp(const string &A, const string& B)
    {
        string subA = A.substr(A.find(' ') + 1);
        string subB = B.substr(B.find(' ') + 1);
        if (isdigit(subA[0])) return false;
        else if (isdigit(subB[0])) return true;
        return subA.compare(subB) < 0;
    }
};

reference:

https://leetcode.com/problems/reorder-log-files/solution/

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/84024838