Sobes.tech
Middle+

Im Prototyp des Verkaufnetzwerks für Werbung ist der Verkauf von Werbeflächen wie folgt organisiert: Käufer nennen im Voraus ihren Preis, und für jeden Werbeplatz antworten sie, ob sie ihn kaufen möchten oder nicht. Es ist notwendig, eine Funktion zu implementieren, die vor dem Verkauf eines Werbeplatzes die Zustimmung oder Ablehnung der Käufer mit dem höchsten Gebot abwartet und dann den Werbeplatz an den Käufer mit dem höchsten Gebot unter denjenigen verkauft, die zugestimmt haben. Die Antwort der Funktion sollte so schnell wie möglich erfolgen. Sie sollte den Index des Käufers zurückgeben. Beispiele: Käufer bieten Preise 1, 5, 10 Der Käufer mit Angebot 10 hat abgelehnt Der Käufer mit Angebot 1 hat zugestimmt // Wir warten noch, da der Käufer mit Angebot 5 noch antworten könnte Der Käufer mit Angebot 5 hat zugestimmt // Wir wählen den Käufer mit Angebot 5 ------------ Käufer bieten Preise 1, 5, 10 Der Käufer mit Angebot 10 hat abgelehnt Der Käufer mit Angebot 5 hat zugestimmt // Wir warten nicht auf die Antwort des Käufers mit Angebot 1 - er wird definitiv nicht ausgewählt ------------ Käufer bieten Preise 1, 2 Der Käufer mit Angebot 1 hat abgelehnt Der Käufer mit Angebot 2 hat abgelehnt // Wir wählen keinen Käufer type Buyer = { price: number, accepts: () => Promise<boolean>, } async function bestBuyer(buyers) { const sorted = buyers.map((buyer, index) => ({buyer, index})) .sort((a, b) => a.buyer.price - b.buyer.price); const promise = sorted.map(({buyer}) => buyer.accepts()); for (let i = 0; i < sorted.length; i++) { const accepted = await promise[i]; if (accepted) { return sorted[i].index; } } if (await buyers[0].accepts()) { return 0; } return -1; }

sobes.tech KI

Antwort von AI

Ваша задача — как можно быстрее определить покупателя с максимальной ценой, который согласился купить рекламное место. При этом ответы покупателей приходят асинхронно и могут быть в любом порядке.

Основная идея решения:

  1. Отсортировать покупателей по цене по убыванию — от самого дорогого к дешевому.
  2. Запустить параллельно все промисы accepts().
  3. Обрабатывать ответы в порядке убывания цены, чтобы как только самый дорогой покупатель согласится, сразу вернуть его индекс.
  4. Если самый дорогой отказался, ждать ответа следующего по цене и так далее.

Это позволит не ждать всех ответов, а вернуть результат как можно раньше.

Пример реализации:

async function bestBuyer(buyers) {
  // Сортируем по убыванию цены
  const sorted = buyers
    .map((buyer, index) => ({ buyer, index }))
    .sort((a, b) => b.buyer.price - a.buyer.price);

  // Запускаем все промисы параллельно
  const acceptPromises = sorted.map(({ buyer }) => buyer.accepts());

  for (let i = 0; i < sorted.length; i++) {
    const accepted = await acceptPromises[i];
    if (accepted) {
      // Возвращаем индекс покупателя с самой высокой ценой, который согласился
      return sorted[i].index;
    }
  }

  // Если никто не согласился
  return -1;
}

Таким образом, мы не ждём ответы покупателей с меньшей ценой, если уже получили согласие от более дорогого покупателя. Это ускоряет получение результата.