Problem
https://leetcode.com/problems/reorder-log-files/description/
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.
Solution: Partition + Sort
- partition the array such that all digit logs are after all letter logs
- sort the letter logs part based on the log content
Time complexity: O(n + aloga)
Space complexity: O(n)
C++
1 2 3 4 5 6 7 8 9 10 11 |
class Solution { public: vector<string> reorderLogFiles(vector<string>& logs) { auto alpha_end = std::stable_partition(begin(logs), end(logs), [](const string& log){ return isalpha(log.back()); }); std::sort(begin(logs), alpha_end, [](const string& a, const string& b){ return a.substr(a.find(' ')) < b.substr(b.find(' ')); }); return logs; } }; |