937. Reorder 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. The digit-logs should be put in their original order.
Return the final order of the logs.
Example 1:
Input: [“a1 9 2 3 1”,“g1 act car”,“zo4 4 7”,“ab1 off key dog”,“a8 act zoo”]
Output: [“g1 act car”,“a8 act zoo”,“ab1 off key dog”,“a1 9 2 3 1”,“zo4 4 7”]
Note:
- 0 <= logs.length <= 100
- 3 <= logs[i].length <= 100
- logs[i] is guaranteed to have an identifier, and a word after the identifier.
方法1:
思路:
要求包括,所有digit log保持原有顺序不变,且都在后面。所有letter log按照字母序排列,如果一样按照identifier的字母序排列。
首先第一步,用c++内置的stable_partition函数将所有letter放在digit前面,通过自定义一个true or false的comparator:stable_partition会将所有返回true的放在前面。第二步:对于前面letter的部分按照第一个" "以后的部分定义comparator。在后面一样的情况下,按照前面的identifier来定义大小。
Complexity
Time complexity: O(n log n)
Space complexity: O(n)
class Solution {
public:
vector<string> reorderLogFiles(vector<string>& logs) {
auto cmp_part = [] (auto a) { return isalpha(a.back()); };
auto it = stable_partition(begin(logs), end(logs), cmp_part); // 1st algorithm
auto cmp_letter = [] (auto & a, auto & b) { // 2nd lambda
int i = a.find_first_of(' ');
int j = b.find_first_of(' ');
if (a.substr(i, a.size() - i) == b.substr(j, b.size() - j)) {
return a.substr(0, i) < b.substr(0, j);
}
return a.substr(i, a.size() - i) < b.substr(j, b.size() - j);
};
sort(begin(logs), it, cmp_letter); // 2nd algorithm
return logs;
}
};