重新排列日志文件。题意如下,
你有一个日志数组 logs。每条日志都是以空格分隔的字串。
对于每条日志,其第一个字为字母数字标识符。然后,要么:
标识符后面的每个字将仅由小写字母组成,或;
标识符后面的每个字将仅由数字组成。
我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按内容字母顺序排序,忽略标识符;在内容相同时,按标识符排序。数字日志应该按原来的顺序排列。
返回日志的最终顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-data-in-log-files
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
例子,
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"]
思路是先将字母日志和数字日志分开,然后对字母日志排序,最后再合并两种日志。判断是字母还是数字的方法是看每个字符串的第二个单词是否是数字(第十行)。
时间O(nlogn)
空间O(n)
1 /** 2 * @param {string[]} logs 3 * @return {string[]} 4 */ 5 var reorderLogFiles = function (logs) { 6 var letters = [], nums = []; 7 8 // Separate digit-logs from letter-logs 9 logs.forEach(function (log) { 10 if (log.split(" ")[1].charAt(0) >= '0' && log.split(" ")[1].charAt(0) <= '9') { 11 nums.push(log); 12 } else { 13 letters.push(log); 14 } 15 }); 16 17 // Sort letter-logs 18 letters.sort(function (a, b) { 19 var cmp = a.slice(a.indexOf(" ")).localeCompare(b.slice(b.indexOf(" "))); 20 return cmp === 0 ? a.localeCompare(b) : cmp; 21 }); 22 return [...letters, ...nums]; 23 };