937. Reorder Data in Log Files*
https://leetcode.com/problems/reorder-data-in-log-files/
题目描述
You have an array of logs
. Each log is a space delimited string of words.
For each log, the first word in each log is an alphanumeric identifier. Then, either:
- Each word after the identifier will consist only of lowercase letters, or;
- Each word after the identifier will consist only of digits.
We will call these two varieties of logs letter-logs and digit-logs. It is guaranteed that each log has at least one word after its identifier.
Reorder the logs so that all of the letter-logs come before any digit-log. The letter-logs are ordered lexicographically ignoring identifier, with the identifier used in case of ties. (这句话的意思见 C++ 实现 1
) The digit-logs should be put in their original order.
Return the final order of the logs.
Example 1:
Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]
Constraints:
0 <= logs.length <= 100
3 <= logs[i].length <= 100
logs[i]
is guaranteed to have an identifier, and a word after the identifier.
C++ 实现 1
这道题看看就好, 难度不大. 其中题目中:
The letter-logs are ordered lexicographically ignoring identifier, with the identifier used in case of ties.
表示, 如果两个 letter-logs
的 identifier 后面的 word 是完全一样的话, 那么就要比较 identifier. 比如:
["let2 art can", "let1 art can"] 结果应该是 ["let1 art can", "let2 art can"]
代码来自: C++ O(NlogN) Time O(N) Space
解释:
Correct Answer
- Split
logs
intoletterLogs
anddigitLogs
. Separate eachletterLog
as a pair of identifier and log content.- Sort
letterLogs
. Try comparing log contents first, if they are the same, use log identifier to break the tie.- Return the concatenation of
letterLogs
anddigitLogs
.
class Solution {
public:
vector<string> reorderLogFiles(vector<string>& logs) {
vector<string> digitLogs, ans;
vector<pair<string, string>> letterLogs;
for (string &s : logs) {
int i = 0;
while (s[i] != ' ') ++i; // 可以修改为 s.find_first_of(' ')
if (isalpha(s[i + 1])) letterLogs.emplace_back(s.substr(0, i), s.substr(i + 1));
else digitLogs.push_back(s);
}
sort(letterLogs.begin(), letterLogs.end(), [&](auto& a, auto& b) {
return a.second == b.second ? a.first < b.first : a.second < b.second;
});
for (auto &p : letterLogs) ans.push_back(p.first + " " + p.second);
for (string &s : digitLogs) ans.push_back(s);
return ans;
}
};