• Найти алгоритм подсчета количеств множественного перекрытия интервалов, а также длительность таких интервалов?

    @DarkOracleLex Автор вопроса
    wataru, извините что я вас столько отвлекал, спасибо вам большое. Вроде смог пройти тесты :)
  • Найти алгоритм подсчета количеств множественного перекрытия интервалов, а также длительность таких интервалов?

    @DarkOracleLex Автор вопроса
    wataru, вроде теперь не собирает нулевые отрезки, выбирает максимальное количество повторений, но всё равно внутренние тесты не проходит. :( Решение:
    function calculateIntervalNumberAndSumOfDuration(strArr) {
      let vacanciesNum = +strArr.shift(); // количество вакансий
      let vacanciesTime = strArr; // массив со временем всех вакансий
      let arrayList = []; // границы отрезков
    
      if (vacanciesNum === 0) {
        return "0 0"; // если нет вакансий выдаём 0
      } else {
        for (const val of vacanciesTime) {
          arrayList.push(
            [+val.split(" ")[0], 1],
            [+val.split(" ")[1] + 1, -1]
          ); // добавляем все границы из массива со временем
        }
        arrayList.sort((a, b) => {
          return a[0] - b[0];
        }); // сортируем по времени границы отрезков
    
        let count = 0; // считаем повторение вакансии
        let intervalAndItsRepetitions = []; // интервалы и сколько раз они повторяются
    
        for (let i = 0; i < arrayList.length - 1; i++) {
          let buffer = []; // складываем сюда отрезок, потом обнуляем
          count += arrayList[i][1];
          if (arrayList[i][1] === 1) {
            buffer.push(arrayList[i][0]);
          } else {
            buffer.push(arrayList[i][0] - 1);
          }
          if (arrayList[i + 1][1] === 1) {
            buffer.push(arrayList[i + 1][0]);
          } else {
            buffer.push(arrayList[i + 1][0] - 1);
          }
          intervalAndItsRepetitions.push([buffer, count]); // складываем отрезок и количество его повторений
        }
        intervalAndItsRepetitions.sort((a, b) => {
          return a[1] - b[1];
        }); // сортируем intervalAndItsRepetitions по количеству повторений
    
        let maxIntervalAndItsRepetitions = []; // максимальные интервалы и сколько они повторяются
        maxIntervalAndItsRepetitions = intervalAndItsRepetitions.filter(
          (val) => {
            if (
              val[1] ===
              intervalAndItsRepetitions[
                intervalAndItsRepetitions.length - 1
              ][1]
            ) {
              if (val[0][0] > val[0][1]) {
                return false;
              }
              return true;
            }
            return false;
          }
        ); //оставляем только максимальные интервалы и убираем интервалы где нач время больше конечного
    
        let intervalCount = maxIntervalAndItsRepetitions.length; // счётчик максимальных интервалов
        let intervalTime = 0; // счётчик времени максимальных интервалов
    
        for (const el of maxIntervalAndItsRepetitions) {
          intervalTime += el[0][1] - el[0][0] + 1;
        }
    
        console.log(maxIntervalAndItsRepetitions);
        return intervalCount + " " + intervalTime;
      }
    }
  • Найти алгоритм подсчета количеств множественного перекрытия интервалов, а также длительность таких интервалов?

    @DarkOracleLex Автор вопроса
    wataru, спросил сейчас в задании и теперь точно запутался в нулевом интервале. В интервале "1595862781 1595862782" "1595862782 1595862783" лучшим будет интервал "1595862782 1595862782" длящийся одну секунду и задевающий сразу две вакансии. Тут же получается "1595862782 1595862783" начинается где заканчивается "1595862781 1595862782".
  • Найти алгоритм подсчета количеств множественного перекрытия интервалов, а также длительность таких интервалов?

    @DarkOracleLex Автор вопроса
    wataru, а какой отрезок имеет длину 0? Ну вот если "11 12" имеет длину 2, "11 11" имеет длину 1? "00 00" имеет длину 0?
  • Найти алгоритм подсчета количеств множественного перекрытия интервалов, а также длительность таких интервалов?

    @DarkOracleLex Автор вопроса
    wataru, спасибо большое за подсказку, переписал код, но всё равно не проходит проверку. На рабочий код смотрю, но мне сложновато Javу понимать. Вот какое у меня получилось решение:
    function calculateIntervalNumberAndSumOfDuration(strArr) {
      let vacanciesNum = +strArr.shift(); // количество вакансий
      let vacanciesTime = strArr; // массив со временем всех вакансий
      let arrayList = []; // границы отрезков
    
      if (vacanciesNum === 0) {
        return "0 0"; // если нет вакансий выдаём 0
      } else {
        for (const el of vacanciesTime) {
          arrayList.push(
            [+el.split(" ")[0], 1],
            [+el.split(" ")[1] + 1, -1]
          ); // добавляем все границы из массива со временем
        }
        arrayList.sort((a, b) => {
          return a[0] - b[0];
        }); // сортируем по X границы отрезков
    
        let intervalCount = 0; // счётчик максимальных интервалов
        let intervalTime = 0; // счётчик времени максимальных интервалов
    
        for (let i = 0; i < arrayList.length; i++) {
          if (
            arrayList[i][1] === 1 &&
            arrayList[i + 1][1] === -1
          ) {
            intervalCount++;
            intervalTime +=
              arrayList[i + 1][0] - arrayList[i][0];
          }
        } // считаем количество максимальных интервалов и их время
    
        return `${intervalCount} ${intervalTime}`;
      }
    }
  • Найти алгоритм подсчета количеств множественного перекрытия интервалов, а также длительность таких интервалов?

    @DarkOracleLex Автор вопроса
    wataru, да, я перебираю все возможные варианты и это и правда долго. Я просто не понимаю как считать отрезками, допустим в таком примере: ["1233 1235", "1234 1236"]. Тут же получается самый часто встречающийся отрезок ["1234 1235"] длящийся 2 секунды, как мне вот такие отрезки находить?
  • Найти алгоритм подсчета количеств множественного перекрытия интервалов, а также длительность таких интервалов?

    @DarkOracleLex Автор вопроса
    wataru
    Пытался как Вы мне написали, не получилось, вроде своё решение нашёл, но теперь не прохожу по памяти :( Не подскажете как можно сократить?
    function calculateIntervalNumberAndSumOfDuration(strArr) {
      let vacanciesNum = +strArr.shift();
      let vacanciesTime = strArr;
    
      if (vacanciesNum === 0) {
        return "0 0";
      } else {
        let allIntervals = [];
        for (const el of vacanciesTime) {
          for (
            let i = +el.split(" ")[0];
            i <= +el.split(" ")[1];
            i++
          ) {
            for (let j = i; j < +el.split(" ")[1] + 1; j++) {
              allIntervals.push(`${i} ${j}`);
            }
          }
        } //Находим все возможные интервалы
        allIntervals.sort();
    
        let repeatingIntervals = [];
        let countRepeating = 1;
        for (let i = 0; i < allIntervals.length; i++) {
          if (allIntervals[i] === allIntervals[i + 1]) {
            countRepeating++;
            continue;
          }
          repeatingIntervals.push(
            `${countRepeating}: ${allIntervals[i]}`
          );
          countRepeating = 1;
        } //Проверяем сколько повторяется каждый интервал
        repeatingIntervals.sort();
    
        let maxIntervalsNum = +repeatingIntervals[
          repeatingIntervals.length - 1
        ].split(": ")[0]; //Узнаём максимальное число повторений интервалов
    
        let maxIntervals = repeatingIntervals.filter((val) => {
          if (+val.split(": ")[0] !== maxIntervalsNum) {
            return false;
          }
          return true;
        }); // Оставляем только максимальные интервалы
    
        let filteredMaxIntervals = maxIntervals.filter(
          (val1, i) => {
            for (const val2 of maxIntervals) {
              let startTime1 = +val1
                  .split(": ")[1]
                  .split(" ")[0],
                endTime1 = +val1.split(": ")[1].split(" ")[1],
                startTime2 = +val2.split(": ")[1].split(" ")[0],
                endTime2 = +val2.split(": ")[1].split(" ")[1];
              if (
                (startTime2 <= startTime1 &&
                  endTime2 > endTime1) ||
                (startTime2 < startTime1 &&
                  endTime2 >= endTime1)
              ) {
                return false;
              }
            }
            return true;
          }
        ); // Убираем все входящие интервалы
    
        let filteredIntervalsNum = filteredMaxIntervals.length; // количество максимальных интервалов
        let filteredIntervalsDurationSum = filteredMaxIntervals.reduce(
          (prev, cur) => {
            prev +=
              +cur.split(": ")[1].split(" ")[1] -
              +cur.split(": ")[1].split(" ")[0] +
              1;
            return prev;
          },
          0
        ); // длина максимальных интервалов
    
        return `${filteredIntervalsNum} ${filteredIntervalsDurationSum}`;
      }
    }
  • Как преобразовать слова?

    @DarkOracleLex
    wataru, извините, я почему-то думал что при "аб" "аа" - должен быть 0. Спасибо большое за помощь :)
  • Как преобразовать слова?

    @DarkOracleLex
    wataru, попробовал решить задачу по вашему алгоритму, получилось что-то такое. Но оно не учитывает вариант "аб аа".
    function isConvertible(str) {
      let str1 = str.split(" ")[0],
        str2 = str.split(" ")[1];
      const map = new Map(),
        set = new Set();
    
      if (str1 === str2) {
        return 1;
      }
      if (str1.length !== str2.length) {
        return 0;
      }
      for (let i = 0; i < str1.length; i++) {
        if (!map.has(str1[i])) {
          map.set(str1[i], str2[i]);
        } else {
          if (map.get(str1[i]) !== str2[i]) {
            return 0;
          }
        }
        set.add(str2[i]);
      }
      if (set.size === 33) {
        return 0;
      }
      return 1;
    }


    У себя в прошлой попытке проблему вот так решил:
    const map1 = new Map(),
            map2 = new Map();
    
          for (let i = 0; i < modifiableStr.length; i++) {
            if (
              (map1.has(modifiableStr[i]) &&
                map1.get(modifiableStr[i]) !== modifierStr[i]) ||
              (map2.has(modifierStr[i]) &&
                map2.get(modifierStr[i]) !== modifiableStr[i])
            ) {
              return 0;
              }
            map1.set(modifiableStr[i], modifierStr[i]);
            map2.set(modifierStr[i], modifiableStr[i]);
          }

    но всё равно что-то там было не правильно.
  • Что я не правильно делаю в тестовом задании?

    @DarkOracleLex Автор вопроса
    wataru, Школа программистов HeadHunter
  • Как преобразовать слова?

    @DarkOracleLex
    1) Проверить, что строки равны. Это особый случай
    Если они равны то нельзя модифицировать? 0 возвращать?
  • Что я не правильно делаю в тестовом задании?

    @DarkOracleLex Автор вопроса
    Robur, Спасибо за ответ! Если не сложно подскажите как узнать сколько памяти занимает код?
  • Что я не правильно делаю в тестовом задании?

    @DarkOracleLex Автор вопроса
    Robur, не проходит проверку, выдаёт что задание выполнено неверно.