Question:

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"]
  2. Output: ["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]

Solution:

  1. /**
  2. * @param {string[]} logs
  3. * @return {string[]}
  4. */
  5. var reorderLogFiles = function(logs) {
  6. // 先过滤掉数字的,最后元素必是英文或者数字
  7. const numArr = logs.filter(i => !isNaN(i[i.length-1] - 0));
  8. const strArr = logs.filter(i => isNaN(i[i.length-1] - 0));
  9. strArr.sort((a,b) => {
  10. var cmp = a.slice(a.indexOf(" ")).localeCompare(b.slice(b.indexOf(" ")));
  11. return cmp === 0 ? a.localeCompare(b) : cmp;
  12. });
  13. return strArr.concat(numArr);
  14. };

Runtime: 60 ms, faster than 95.11% of JavaScript online submissions for Reorder Log Files.

localeCompare() 方法返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同。