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

Массив будет иметь вид [6, 1, 2, 5, 7], а результат будет равен 6. Самая низкая цена акции приходится на 2-й день, что равно 1, а самая высокая цена — на 5-й день, что равно 7. Итак. покупка по цене 1 и продажа по 7 даст нам прибыль в размере 6.

Теперь давайте рассмотрим, как найти это в JavaScript.

function findMaximumProfit(prices) {
  const length = prices.length;
  let buyPrice = prices[0];
  let maxProfit = 0;

  for (let i = 1; i < length; i++)  {

    if (buyPrice > prices[i]) {
      buyPrice = prices[i];
    } else {
      maxProfit = prices[i] - buyPrice;
    }    
  }
  return maxProfit;
}

console.log(findMaximumProfit([6, 1, 2, 5, 7])); //6

Пояснение кода:

Сначала мы объявим несколько переменных: length для хранения длины переменной, объявим buyPrice и присвоим первую цену из массива, а maxProfit присвоим 0. Мы начнем итерацию с первого индекса, так как мы уже присвоили 0-е значение для переменная. На каждой итерации мы будем проверять, больше ли buyPrice текущей цены. Если да, то мы изменим значение на эту цену. В противном случае мы проверим прибыльную покупку, вычитая оба значения. В конце цикла мы вернем значение maxProfit.

Этот массив возвращает прибыль как 6. Нам нужно купить акцию по цене 1 и продать по цене 7.

Существует также другой вариант этих вопросов, когда интервьюер может спросить дату покупки и продажи вместо прибыли. Мы также можем легко решить эту проблему, изменив тот же код.

function findBuySellDate(prices) {
  const length = prices.length;
  let buyPrice = prices[0];
  let maxProfit = 0;
  let buyDate = 0;
  let dates = [];

  for (let i = 1; i < length; i++)  {
    if (buyPrice > prices[i]) {
      buyPrice = prices[i];
      buyDate = i;
    } else {
      maxProfit = prices[i] - buyPrice;
      dates = [buyDate, i];
    }    
  }
  return dates;
}

console.log(findBuySellDate([6, 1, 2, 5, 7])); // [1, 4]

Запуск этой функции с тем же кодом сейчас вернет индексы для покупки и продажи.

Смотрите на нашем YouTube