题目:
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. 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.
自己写一个comparator,注意比较的时候,如果log里的单词都一样,要比较identifier。
vector的comparator返回值表示:a要排在b的前面吗?即,a<b为true,则a排在b的前面,就是从小到大排。
Runtime: 24 ms, faster than 14.68% of C++ online submissions for Reorder Data in Log Files.
Memory Usage: 16.7 MB, less than 29.41% of C++ online submissions for Reorder Data in Log Files.
class Solution {
public:
static bool comp(string a, string b) {
int a1 = a.find(' ');
int b1 = b.find(' ');
// if both are letters
if (isalpha(a[a1 + 1]) && isalpha(b[b1 + 1])) {
// if the log words are the same, compare the identifier
if (a.substr(a1 + 1) == b.substr(b1 + 1)) {
return a < b;
}
else {
return a.substr(a1 + 1) < b.substr(b1 + 1);
}
}
// if one is letter and one is digit
else {
// a is letter and b is digit
if (isalpha(a[a1 + 1])) {
return true;
}
else {
return false;
}
}
}
vector<string> reorderLogFiles(vector<string>& logs) {
stable_sort(logs.begin(), logs.end(), comp);
return logs;
}
};