Изменить порядок данных в файлах журнала - Javascript - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь решить алгоритм Reorder Data in Log Files.

У вас есть массив журналов. Каждый журнал представляет собой строку слов, разделенных пробелами.

Для каждого журнала первое слово в каждом журнале представляет собой буквенно-цифровой идентификатор c. Тогда либо:

Каждое слово после идентификатора будет состоять только из строчных букв, либо; Каждое слово после идентификатора будет состоять только из цифр. Мы будем называть эти две разновидности журналов letter-log и di git -log. Гарантируется, что каждый журнал имеет хотя бы одно слово после идентификатора.

Переупорядочить журналы так, чтобы все буквенные журналы располагались перед любым di git -log. Письма-журналы упорядочены лексикографически без учета идентификатора, с идентификатором, используемым в случае связи. Журналы di git должны быть расположены в исходном порядке.

Возвращает окончательный порядок журналов.

Пример:

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"]

Моя идея карта для цифр и одна для букв. Я сделал это. Затем мне нужно будет отсортировать цифры и буквы и добавить все отсортированные буквы в мой массив ответов и все отсортированные цифры в свой массив ответов.

var reorderLogFiles = function(logs) {
    if(!logs || logs.length === 0)
        return [];
    
    let numbers = {
        '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6,
        '7': 7, '8': 8, '9': 9
    };
    let digits = new Map();
    let letters = new Map();
    
    for(let i=0; i<logs.length; i++) {
        const log = logs[i].split(" ");
        if(numbers[log[1]] !== undefined) 
            digits.set(log[0], log.splice(1, log.length));
        else
            letters.set(log[0], log.splice(1, log.length));
    }
    
    // How can I sort letter and digits?
    
    let ans = [];
    for(const [key, value] of sortedLetters) {
        const temp = key + " " + value.join(" ");
        ans.push(temp);
    }
    for(const [key, value] of sortedDigits) {
        const temp = key + " " + value.join(" ");
        ans.push(temp);
    }
    
    return ans;
};

1 Ответ

1 голос
/ 04 августа 2020

Думаю, вы можете несколько упростить свой код. Сначала создайте группы цифр и букв, отфильтровав исходные журналы; это можно упростить, сначала разделив все значения в logs. Затем отсортируйте буквы на основе второго значения в массиве и добавьте цифры в конец отсортированного массива. Наконец, join строки снова вместе:

const reorderLogFiles = logs => {
  // split values on first space
  logs = logs.map(v => v.split(/\s+(.*)/).filter(Boolean));
  // filter into digits and letters
  let digits = logs.filter(v => v[1].match(/^[\s\d]+$/));
  let letters = logs.filter(v => v[1].match(/^[a-z\s]+$/));
  // sort the letters
  letters.sort((a, b) => (c = a[1].localeCompare(b[1])) ? c : a[0].localeCompare(b[0]));
  // reassemble the list
  result = letters.concat(digits);
  // and convert back to strings
  result = result.map(a => a.join(' '));
  return result;
}

let logs = ["dig1 8 1 5 1", "let1 art can", "dig2 3 6", "let2 own kit dig", "let3 art zero"];
console.log(reorderLogFiles(logs));
logs = ["a1 9 2 3 1", "g1 act car", "zo4 4 7", "ab1 off key dog", "a8 act zoo", "a2 act car"];
console.log(reorderLogFiles(logs));

Обратите внимание, что этот код можно написать более компактно, объединяя операции в цепочку, но я написал его более полно, чтобы упростить выполнение.

Если вы не хотите использовать регулярное выражение, вы можете проверить первый символ каждой подстроки, чтобы увидеть, является ли это di git или буквой. Например:

let digits = logs.filter(v => v[1][0] >= '0' && v[1][0] <= '9');
let letters = logs.filter(v => v[1][0] >= 'a' && v[1][0] <= 'z');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...