版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[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"]
提示:
0 <= logs.length <= 100
3 <= logs[i].length <= 100
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
如有问题,希望大家指出!!!