题目描述:
给你一个日志数组 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;
}
};