Помогите решить задачу с собеса

Рейтинг: 0Ответов: 1Опубликовано: 21.03.2023

Нужно написать функцию. На вход поступает массив чисел. Числа больше либо равны 0 и не повторяются.
Если числа из исходного массива (не обязательно идущие по порядку)образуют непрерывную числовую последовательность, то следует их добавить в результат по паттерну 'Начало последовательности - Конец последовательности'. Если число не входит в последовательность, то добавить его в результат через запятую.
Алгоритмическая сложность должна быть не выше O(n log n)

Пример: Параметр: [9, 0, 6, 8, 2, 5, 4] Возвращаемый результат: '0, 2, 4-6, 8-9'

PS: код ниже добавил, но он не работает по понятным причинам. Вопрос скорее к алгоритму, не могу понять каким методом решить. SOS

const testFunc = (nums) => {
  let range = [];
  let res = "";
  const sortNums = nums.sort((a, b) => a - b);
  for (let i = 0; i < sortNums.length; i++) {
    if (sortNums[i] + 1 === sortNums[i + 1]) {
      range.push(sortNums[i]);
    }
    res += `${range[0]}-${range[-1]},`;
    range = [];
    res += `${sortNums[i]},`;
  }
  return res;
};

console.log(testFunc([9, 0, 6, 8, 2, 5, 4]))

Ответы

▲ 1Принят
  1. Неверная проверка на наличие следующего элемента
  2. range[-1] - нет такого способа обращения к последнему элементу массива
  3. Нет добавления последовательности в результат

Ну это если из основного

Можно сделать так:

const testFunc = (nums) => {
  const sortedNums = nums.sort((a, b) => a - b);
  let res = "";
  let start = sortedNums[0];
  let end = sortedNums[0];

  for (let i = 1; i < sortedNums.length; i++) {
    if (sortedNums[i] === end + 1) {
      end = sortedNums[i];
    } else {
      if (start === end) {
        res += `${start},`;
      } else {
        res += `${start}-${end},`;
      }
      start = sortedNums[i];
      end = sortedNums[i];
    }
  }

  if (start === end) {
    res += `${start},`;
  } else {
    res += `${start}-${end},`;
  }

  return res.slice(0, -1);
};

console.log(testFunc([9, 0, 6, 8, 2, 5, 4]));