Sobes.tech
Middle

/* Dwie posortowane listy z interwałami obecności użytkowników w ciągu dnia. Początek interwału jest ściśle mniejszy od końca. Należy obliczyć interwały, podczas których obaj użytkownicy byli online. Interwały są podane w godzinach, zakładając, że mogą się wahać od 0 do 24. */ przecięcie( [[8, 12], [17, 22]], [[5, 11], [14, 18], [20, 23]] )// [[8, 11], [17, 18], [20, 22]] przecięcie( [[9, 15], [18, 21]], [[10, 14], [21, 22]] )// [[10, 14]] function przecięcie(użytkownik1, użytkownik2) { // wpisz swój kod tutaj }

sobes.tech AI

Odpowiedź od AI

Для нахождения пересечения двух списков интервалов можно использовать алгоритм с двумя указателями, проходя по обоим спискам одновременно и вычисляя пересечения текущих интервалов.

Пример решения на JavaScript:

function intersection(user1, user2) {
  let i = 0, j = 0;
  const result = [];

  while (i < user1.length && j < user2.length) {
    const start = Math.max(user1[i][0], user2[j][0]);
    const end = Math.min(user1[i][1], user2[j][1]);

    if (start < end) { // есть пересечение
      result.push([start, end]);
    }

    // сдвигаем указатель у того интервала, который заканчивается раньше
    if (user1[i][1] < user2[j][1]) {
      i++;
    } else {
      j++;
    }
  }

  return result;
}

// Пример использования:
console.log(intersection(
  [[8, 12], [17, 22]],
  [[5, 11], [14, 18], [20, 23]]
));
// Выведет: [[8, 11], [17, 18], [20, 22]]

Этот алгоритм работает за время O(n + m), где n и m — длины списков интервалов.