Я пытаюсь создать код RLE без успеха

#javascript

#javascript

Вопрос:

Я пытаюсь создать функцию «Кодирования длины выполнения», и я застрял посередине.

Например, у меня есть строка: "RRRTTTFBB" и я пытаюсь разделить ее на массив такого типа: ["RRR", "TTT", "F", "BB"] .

Мне удалось поместить в элементы только 1 ключ массива вот так: ["RR" "R" "TT" "T" ....]

Я пытался сделать это с помощью цикла while, для цикла, if / else, переключения, но я не могу понять, что я делаю не так.

 function rleFunc(str) {
  let newArr = [];
  const strTrim = str.trim();
  const strUp = strTrim.toUpperCase();
  const arr = strUp.split("");
  const arrLength = arr.length;
  // Anyone has idea what to put here?? I'm lost
  return newArr;
}
  

Комментарии:

1. Можете ли вы поделиться версией, которую вы пробовали с for циклом (кажется, наиболее подходящим для задачи), и уточнить, что было не так? Помните, что SO не является бесплатным сервисом для написания кода.

2. Я не просил бесплатного кодирования. новый массив — это всего лишь часть моего процесса. У меня его больше нет, потому что я многое удалил и перепробовал!

Ответ №1:

Альтернативным подходом было бы использовать регулярное выражение с .match , чтобы получить желаемый результат:

 const str = "RRRTTTFBB";
console.log(str.match(/(.)1*/g));  

Это работает благодаря выражению:

  • (.) : Означает группировать любой символ
  • 1* : Означает использовать ранее сгруппированный символ и сопоставить его с нулевым количеством вхождений
  • /g : Означает повторение этого шаблона для всей строки (а не только для первого вхождения)

Ответ №2:

  const result = [];
 let count = 1;

 const input = "RRRTTTFBB";

 for(let index = 1; index < input.length; index  ) {
    if(input[index] !== input[index - 1]) {
      result.push(input[index - 1].repeat(count));
      count = 1;
     } else count  ;
 }
  

Комментарии:

1. Хотя эта команда может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.

2. «Попробовать» никогда не является ответом

Ответ №3:

 function group(arr) {
  const groups = [arr[0]]

  for (const char of arr.slice(1)) {
    const last = groups.length - 1

    if (char === groups[last][0]) {
      groups[last]  = char
    } else {
      groups.push(char)
    }
  }
  
  return groups
}

console.log(group('RRRTTTFBB'))  

Комментарии:

1. @JonasWilms действительно потребовалось несколько настроек. Пересмотр помогает 🙂

Ответ №4:

Я бы рекомендовал не использовать регулярные выражения для тривиальных задач или если вам это не нужно. Также, если вычисляемая строка является пользовательским вводом. Это может привести к блокировке работы в узле. Прочитайте об этом здесь:https://nodejs.org/en/docs/guides/dont-block-the-event-loop /

 arr="RRRRTTHHHJJJHHJ"
    const map = new Map;
    for (const char of arr.split('')) {
  
    if (map.has(char)) {

    map.set(char, map.get(char) char)
    } else {
    map.set(char, char)
    }
    }
    console.log([...map.values()]);  

Комментарии:

1. любые комментарии к понижающему голосованию были бы очень полезны.