Task from JS Interview: The Best Time to Buy Stocks # 2

Поделиться
HTML-код
  • Опубликовано: 20 сен 2024

Комментарии • 119

  • @Vel1ar1
    @Vel1ar1 2 года назад +16

    Люблю такие задачи, которые кажутся сложными, но решаются в пару строчек кода. Спасибо за интересный контент.

    • @frontendscience
      @frontendscience  2 года назад +4

      Я сам обожаю такие задачи! Когда не понимаешь вначале как к ней подступить, а потом оказывается такое короткое решение :)

  • @serdotsenko
    @serdotsenko 2 года назад +5

    програмерской точки зрения - упражнение полезное!
    с прикладной (трэйдерской) точки зрения - чюхня полнейшая )) главное в трэйдинге это сделать тот самый прогноз куда именно пойдёт цена )

    • @frontendscience
      @frontendscience  2 года назад +1

      Да, так и есть)))

    • @oleg_deezus
      @oleg_deezus 2 года назад

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

  • @sokoloff114
    @sokoloff114 2 года назад +2

    Спасибо! Сначала решил с дополнительными проверками, а потом на 1:54 увидел подсвеченные участки графика и понял, что достаточно просто складывать прирост, для чего идеально подошел reduce!

  • @Павел-п2э
    @Павел-п2э 2 года назад +1

    Прикольная задачка, решил сразу, только чуть в другом исполнении.
    Взял в проверке prices[ i ] < prices[ i + 1], sum += prices[i + 1] - prices[i].
    Побольше бы такого контента. Спасибо вам за ваш труд)

    • @frontendscience
      @frontendscience  2 года назад +1

      Рады, что понравилось! Благодарим за поддержку!

  • @GreenGotty
    @GreenGotty 2 года назад

    Спасибо за задачку! Вот так вышло, в этот раз скоростью)
    Runtime: 68 ms, faster than 97.01% of JavaScript online submissions for Best Time to Buy and Sell Stock II.
    Memory Usage: 40.5 MB, less than 20.45% of JavaScript online submissions for Best Time to Buy and Sell Stock II.
    var maxProfit = function(prices) {
    var profit = 0;
    for (let i = 0; i < prices.length - 1; i++) {
    if (prices[i + 1]

  • @SerzhNesteruk
    @SerzhNesteruk Год назад

    Спасибо за задачу!
    Решил через reduce:
    const maxProfit = prices => prices.reduce((acc, curr, index, arr) => {
    const profit = curr - arr[index - 1];
    return acc + (profit > 0 ? profit : 0);
    }, 0);

  • @antonnovatsky6777
    @antonnovatsky6777 2 года назад +2

    Спасибо, это полезный контент! Пожалуйста, не останавливайтесь.

  • @anarbekomurzakov8089
    @anarbekomurzakov8089 2 года назад +2

    Класс. Побольше таких решений. 👍👍👍

  • @СерверИзединов-й3ъ
    @СерверИзединов-й3ъ 2 года назад +1

    Супер. Ребята давайте попросим побольше таких задачек)

  • @stillonov
    @stillonov 2 года назад

    Я бы эту задачу назвал «Подсчет упущенной выгоды». Если представить, что это реальный курс акции публичной компании и это не будущее, а прошлое)
    Спасибо вам за ваши видео!

  • @user-kb5kd7ln3h
    @user-kb5kd7ln3h 9 месяцев назад

    сначала так решил..., потом когда посмотрел ваше решение понял принцип который и в предыдущих задачах попадался: что мы можем что то посчитать отдельно для каждого элемента и потом просто все сложить, это как раз получается один проход по массиву
    а у меня для каждого текущего минимального значения происходит поиск следующего максимального по всему оставшемуся массиву в функции findMaxValue() -
    тоесть поиск значения которое может быть самым большим до падения акций... (именно это и усложнило весь алгоритм)
    const bestTime = (input) => {
    let min = input[0], max = null, maxProfit = 0
    const findMaxValue = (index) => {
    let maxValue = input[index]
    for(let i = index; i < input.length; i++){
    if(maxValue < input[i]){
    maxValue = input[i]
    } else {
    break
    }
    }
    return maxValue
    }
    for(let i = 0; i < input.length; i++){
    if(input[i] < input[i+1]){
    min = Math.min(min, input[i])
    } else if(input?.[i-1] < input[i]){
    max = findMaxValue(i)
    maxProfit += max - min
    max = null
    min = input[i+1]
    }
    }
    return maxProfit
    }

  • @kitbax849
    @kitbax849 2 года назад +2

    let prices = [5, 1, 2, 3, 4, 7]. Профит 6 если купить во второй день по цене 1 и продать в последний по цене 7. Ваш алгоритм выдает профит 3. Сергей, я неправильно понял условие задачи?

    • @frontendscience
      @frontendscience  2 года назад

      Вероятно, где-то допустили ошибку когда перепечатывали код. Мой код выдает 6 на таком входном массиве.

  • @gimonchik
    @gimonchik 2 года назад +10

    Привет, решается в одну строчку (если я правильно понял задачу):
    array.reduce((sum, current, index, arr) => current > arr[index - 1] ? sum += current - arr[index - 1] : sum, 0)

    • @frontendscience
      @frontendscience  2 года назад +1

      отличный однострочник! Благодарю за решение

    • @NormanRosewood
      @NormanRosewood 2 года назад +3

      @@frontendscience "отличный", только если неистово любить превращать код в нечитабельный

    • @yaroslavoz
      @yaroslavoz 2 года назад

      тоже сначала так решил, но возвращал не сумму при невыполнении условия, потом переписал циклом)

    • @АлександрМ-ь5ю
      @АлександрМ-ь5ю 2 года назад +1

      "+=" тут не нужен, достаточно просто "+"

  • @Romka_008
    @Romka_008 2 года назад

    Решил самостоятельно точно также как в видео, только через i + 1, потом из комментов увидел reduce и вспомнил про него)

    • @frontendscience
      @frontendscience  2 года назад

      да, можно через reduce, так будет компактнее

  • @sadigzade.hi10
    @sadigzade.hi10 Год назад +4

    Для массива, например [7, 1, 2, 1, 2, 9], максимальный profit = 8, но по алгоритму, который приведен в видео, мы получим 2
    Это разве правильно?
    Наша же задача получить максимальный profit

    • @kotyaboko
      @kotyaboko 11 месяцев назад

      По алгоритму відео ми отримаємо 9, що і є макс профітом, так як ми можемо купляти і продавати в один день (ти трохи прорахувався, продати можна два рази, на першій 2 та на 9). Я також думав, що так не можна, аж поки рішення не побачив.

    • @mortboxmx3498
      @mortboxmx3498 4 месяца назад

      @@kotyaboko 為什麼用不同的語言回覆評論? 納粹

  • @ДашаКороткевич
    @ДашаКороткевич Месяц назад

    Спасибо большое!

  • @web2905
    @web2905 Год назад

    Через forEach вот так сделал
    let price1 = [0, 7, 1, 5, 3, 6, 4] // 14
    let price2 = [7, 6, 4, 3, 1] // 0
    function merge(price) {
    let prev = price[0]
    let result = 0
    price.forEach(element => {
    if (prev < element) {
    result = result + element - prev
    }
    prev = element
    })
    return result
    }
    console.log(merge(price1))

  • @АндрейНикифоров-ц8й

    Хотел сказал что у тебя оч хорошая картинка и выставки тоже на высоте, видно, что ты стараешься, хоть канал и нишевый я думаю просмотры увеличатся👍

  • @Computermind11
    @Computermind11 2 года назад +2

    Поставил два лайка с разных аккаунтов. Решение не стал кидать, так как решил примерно таким же образом. :))

  • @evgeniytimofeev6281
    @evgeniytimofeev6281 2 года назад

    Спасибо за Ваш контент, лайк)
    Ещё есть такой вариант более сложный, который мне пока не решить:
    Есть массив акций 7, 1, 5, 3, 6, 4
    Чтобы получить максимальный профит нам нужно купить акции 1, 3 и продать по 6, тогда выгода будет 8 (6-1 + 6-3)

    • @EvgeshaFromUa
      @EvgeshaFromUa 2 года назад

      В этой задачке, мы не можем покупать и еще раз купить. Мы можем покупать/продавать или продавать/покупать. А если делать как вы, то можно купить на 5 и продать на 6 и получить один доп пункт

    • @evgeniytimofeev6281
      @evgeniytimofeev6281 2 года назад

      @@EvgeshaFromUa я думал, вдруг, тут захотят увидеть решение более сложной задачи, я решал в более сложном условии, не мог решить, когда писал этот коммент. Сейчас осенило, та задача, что была на видео мне была понятна, но спасибо, что объяснили ещё раз (вдруг я не понял)

    • @EvgeshaFromUa
      @EvgeshaFromUa 2 года назад

      @@evgeniytimofeev6281 Полностью согласен, чем тяжелее в учение тем легче в бою!

  • @ledfed4318
    @ledfed4318 2 года назад

    Стоит просмотреть секунд 10 "Алгоритм решения" и сразу начинаю думать в нужном русле и получается решить задачу пусть и по своему

  • @nataliavardazaryan3981
    @nataliavardazaryan3981 2 года назад +1

    спасибо за полезную инф для новичков

  • @Albelykh
    @Albelykh 2 года назад +1

    Почему итерация цикла начали с 0?
    В первой итерации будет обращение по индексу -1. Да, в JS это не проблема, но в других ЯП за это "наказывают" очень сильно.
    К тому же, нет смысла начинать цикл с 0. Нужно начинать с 1.
    Поэтому, хорошо бы сделать проверку на в начале, что элементов в массиве должно быть как минимум 2.

    • @frontendscience
      @frontendscience  2 года назад

      Учитывая условие задачи, что в массиве всегда есть минимум один элемент - да действительно можно начинать было с индекса 1. Но я когда писал решение, предполагал что массив может быть пустым. И тут я сторонник более компактного решения и использования "силы" js. когда не нужно беспокоится о проблемах boundaries. Зачем писать доп строчку с проверкой на пустой массив если проверка if (4 > undefined) вернет всегда false. К счастью мы пишем не на других ЯП а именно на js :)

    • @Albelykh
      @Albelykh 2 года назад

      @@frontendscience Тут же дело не столько в boundaries, сколько в том, что не смысла начинать проверять с индекса 0. Мы всё равно должны проверить "текущий" и "предыдущий", а это уже подразумевает как минимум 1 и 0. Да, можно начать хоть с -100 - код тоже будет работать.
      Для меня как красная тряпка - "пишешь цикл по массиву - проверь себя на выход за пределы".
      На счет второй части моего вопроса про первый восходящий тренд - я там окзался не не прав. Я удалил это из комментария.

  • @neatunet
    @neatunet 2 года назад +3

    Можете, пожалуйста, снять отдельное видео про оценку сложности алгоритмов? Или такое видео уже есть на канале?

    • @frontendscience
      @frontendscience  2 года назад +2

      Приятного просмотра: ruclips.net/video/Fu4BzQNN0Qs/видео.html :)

  • @butecher
    @butecher 2 года назад

    Сделай побольше таких видео!)

  • @beknazaromuraliev5680
    @beknazaromuraliev5680 2 года назад

    классно побольше такой контент

  • @DreamingDolphing
    @DreamingDolphing 2 года назад +1

    Очень странно, но ваш алгоритм только покупает дёшево и продает дороже на следующий день. А если точка выгодной продажи не в следующий день, а через несколько дней восходящего тренда?

    • @Albelykh
      @Albelykh 2 года назад

      Тут принимается допущение что алгоритм "знает" всю историю цен в будущем, поэтому несколько возрастающих трендов можно рассматривать как одну продажу. Конечно, данный алгоритм не имеет никакой связи с реальностью.

    • @blgarOk
      @blgarOk 2 года назад

      Где в решении указано что продажа происходит каждый день в случае выгоды? Алгоритм льшь считает эту самую выгоду за каждый день. К примеру у нас цена растет три дня подряд, мы покупаем акции в первый день и продаём на 3й. Предложенное решение корректно рассчитает нашу выгоду.

  • @opticsandspectrometry994
    @opticsandspectrometry994 Год назад

    тут ограничение, что можно купить только 1 акцию? А если ввести начальную сумму, то что изменится? Из неочевидного - будут ли ситуации, когда выгодно купить не на всю оставшуюся сумму, а на часть? Похоже, что не будет. А если сделать еще ежедневное ограничение по количеству доступных для приобретения акций?

  • @valvetigu5207
    @valvetigu5207 2 года назад

    Не стоит ровнятся на мое мнение, я не выполнил тестовое для стажировки. Но все же.
    Беда таких задач в том, что ты смотришь на условия и думаешь. Так, если это акции, то надо бы выводить день, оба значения, самую большую разницу и тд.
    Мне в моем однопоточном мозгу не хватает воды чтобы понять что выводить на данного типа заданиях

    • @frontendscience
      @frontendscience  2 года назад

      Ну да, решение такого типа задач требует умения абстрагироваться и решать только входные данные)

  • @user-zu4pr2su4c
    @user-zu4pr2su4c 2 года назад

    Вот такая тестовая задача.
    На вход функции absentNumber подается массив с натуральными числами до n включительно, числа неупорядочены и каждое число встречается по одному разу, кроме одного, оно отсутствует, необходимо определить какое и вернуть его. Чтобы вычислительная сложность была O(n)

    • @frontendscience
      @frontendscience  2 года назад

      Классная задача. Я ее раньше давал на собеседованиях. Думаю сделаю отдельное видео с ней и ее более сложными вариациями

  • @SKiPER210397
    @SKiPER210397 Год назад

    А якщо так: [8, 10, 8, 3, 5, 12, 11]?
    Питання, якщо ми в один день можемо здійснити одну дію (покупка/продаж), який буде профіт?
    Функція поверне 11, а якщо зважати на умову то тут профіт буде 4.
    Тобто рішення не відповідає умові "одна дія - один день".
    Чи я щось не правильно зрозумів?)

  • @yaroslavoz
    @yaroslavoz 2 года назад

    прикольно) практически тот же вариант, только сравнивал текущий айтем со следующим, то есть prices[i+1] > prices[i], получается что у тебя андефайнд сравнивается на первой итерации, а у меня на последней)

  • @lor1k
    @lor1k 2 года назад +2

    Но если купить на шагах 2,3,4 и продать всё на 5, то профита будет 9

    • @frontendscience
      @frontendscience  2 года назад

      Мы не можем «докупать» - мы можем купить и после покупки пока не продадим не можем купить еще. Если не ошибаюсь такая задача тоже есть (с докупкой) думаю еще разберем ее

    • @lor1k
      @lor1k 2 года назад

      @@frontendscience ну тогда всё ок:) А то в видео не услышал этих условий

    • @frontendscience
      @frontendscience  2 года назад

      @@lor1k говорил об этом на 1:00 )

  • @SerhiyLevashov
    @SerhiyLevashov 2 года назад

    А если начать цикл с i=1, то уменьшим кол-во итераций на 1 и добавим еще немного profit на экономии вычислительных мощностей)

    • @frontendscience
      @frontendscience  2 года назад +1

      Если учесть условие на литкод, что массив всегда содержит хотя бы один элемент - то да, можно начать с i=1. Если массив может быть пустым, то лучше оставить i=0, чтобы не делать доп проверку на пустой массив.

  • @kostja123434
    @kostja123434 2 года назад

    const foundation = (nums) => {
    let sum = 0
    nums.reduce((acc, cur) => {
    if (acc > cur) return acc = cur
    else {
    sum = sum + (cur - acc)
    return acc = cur
    }
    })
    return sum
    }

    • @frontendscience
      @frontendscience  2 года назад

      Благодарю за решение! Отличный компакнтый вариант! )

  • @neohak1
    @neohak1 2 года назад +1

    Смотрю код и не понимаю как отрабатывает первая итерация цикла, ведь там значение i буде отрицательным (-1).

    • @frontendscience
      @frontendscience  2 года назад +1

      Там нет отрицательного значения, там есть проверка, больше ли первый день, чем undefined. И эта проверка всегда будет возвращать false.

  • @rafomosinyan68
    @rafomosinyan68 Год назад +1

    function exchangeCalc (arr){

    let revenue = 0;
    let indicator = true;
    for(let i = 0;i

  • @КарэнАкопьян
    @КарэнАкопьян Год назад

    можно объяснение почему 14, если начинается с 0?

  • @Vllad_Ko
    @Vllad_Ko Месяц назад

    это не будет работать если есть два дня и больше одного тренда

  • @handleSome-g1z
    @handleSome-g1z 2 года назад

    Добрый день. Спасибо за видео! Можете, пожалуйста, подсказать тему редактора?

  • @RockiBY
    @RockiBY 2 года назад

    Какого уровня задачи с codewars стоит решать, чтобы укрепить знания алгоритмов для джуна на фронтенд?

  • @blgarOk
    @blgarOk 2 года назад

    Задачка простейшая. Но решить ее не смог, имея опыт решения много более сложных задач. Не уловил сразу ключевой момент - нужно всего лишь просуммировать отрезки между соседними днями с восходящим трендом. Печаль.

    • @frontendscience
      @frontendscience  2 года назад

      Нестрашно! Но да, бывает так, что самое сложное в задаче - понять, как трансформировать ее условие в более понятные и простые сущности)

  • @Nearfulz
    @Nearfulz 2 года назад

    Я может не до конца понял условие. Но вроде же на массиве типа [1,3,6,9] этот алгоритм будет работать неправильно? Или будет третья часть, где в условиях будет возможность не продавать и не покупать акции, когда нам это не нужно?

    • @frontendscience
      @frontendscience  2 года назад

      Он будет работать корректно - так как мы можем продавать и покупать в один и тот де день. Покупать и продавать мы можем сколько угодно раз - нет ограничений. И да есть еще версии этой задачи когда нам надо посчитать профит с минимальным количеством покупок/продаж.

  • @kotyaboko
    @kotyaboko 11 месяцев назад

    Я думав ми не можемо купляти і продавати в один день і чуть не зламав мозг, а тут оказується все так просто

  • @АрсенийКоротких-с8ь

    Можете мне помочь, что делать. Я начал учиться на пайтон бекенд разработчика. обучение 10 месяцев. прошло 2 месяца. и в один момент я просто не понимаю что вообще делать как решать задачи не могу выстроить алгоритм решений данной задачи. Я уже самый отстающий на потоке. И мотивации продолжать нет и желания что то делать тоже. Очень тяжело дается мне все это. Я порой сижу и думаю, может это действительно не мое. Что делать в такой ситуации??? Проблема наверное в основном в том что я не могу выстроить алгоритмическую цепочку как решать задачи. Полная каша в голове. Материал не усваивается тоже. Хотя пишу лекции и пересматриваю материал несколько раз. У нас есть разборы ДЗ я смотрю вроде все понятно как делают наставники, но я понимаю что я тупо копирую код и все. а сам не понимаю.

    • @frontendscience
      @frontendscience  2 года назад

      Привет, Арсений. Я не знаю, где Вы учитесь, но это вопрос явно к наставникам (менторам) и самой обучающей компании. Если Вы откровенно расскажете Вашим менторам текущую ситуацию, может быть это все изменит. По идее обучающие компании должны быть сильно заинтересованы в том, чтоб их студенты высоко перфомили. Где-то они не дорабатывают. Или может у Вас не тот подход, что они закладывали. Нужно с ними обсуждать.
      Но в любом случае повторять код за кем-то в самом начале - это правильно! Главное понимать принцип, алгоритм и то, что именно Вы пишете. Самостоятельные решения будут приходить только с практикой. Поначалу все копируют. Я тоже в комментах часто советую посмотреть видео с решением задачи. И попробовать воспроизвести код - чтоб хоть немного отложилось в памяти. Еще лучше через несколько недель попробовать вернуться к той же задаче и попробовать снова воспроизвести решение. Да, это требует труда. Но потом Вы даже не поймете, когда уже начали самостоятельно решать аналогичные задачи. И все благодаря Вашим тренировкам. Терпения Вам и успехов!

    • @АрсенийКоротких-с8ь
      @АрсенийКоротких-с8ь 2 года назад

      @@frontendscience Спасибо большое за развернутый ответ.

  • @oleksandrvoron_ko580
    @oleksandrvoron_ko580 2 года назад

    Дякую! Дійсно легка задачка! Правда спочатку поспішив і prices[i+1]; По вашому відео зрозумів, що просто треба було брати менший індекс на 1

  • @inqvisitor3722
    @inqvisitor3722 2 года назад

    задача неправильно называется, в реальности, нужно решать, купить в 1 день по 7 или нет, а если в 4 день было бы 6, считался бы он лучшем временем для покупки? И в описании: "...прибыль, которую можно заработать..." - нужна машина времени, чтобы получить такой массив. В общем, задачка ради задачки

    • @frontendscience
      @frontendscience  2 года назад

      Нужно мыслить шире. Например есть задача проанализировать архив цен за последний месяц и понять какой максимальный профит можно было бы заработать.

  • @ЯрославПлахтієв
    @ЯрославПлахтієв 2 года назад

    как-то слишком легко
    var maxProfit = function(prices) {
    let profit = 0
    for (let i = 0; i < prices.length - 1; i++) {
    const element = prices[i];
    const nextElement = prices[i + 1]
    if (element < nextElement) {
    profit += nextElement - element
    }
    }
    return profit
    };

    • @frontendscience
      @frontendscience  2 года назад

      Да, когда понимаешь как решать - все выходит очень просто.

  • @АндрейНикифоров-ц8й

    Какой я сложным способом это решил

  • @Den-hk7ek
    @Den-hk7ek 2 года назад

    Условие задачи абсолютно некорректное. Зачем впутывать сюда акции?! Если есть операция покупки в какой-то точке, то нужно заранее знать будут ли акции дороже, а вдруг далее только спад, можно ли продавать и покупать в одной точке и т.д.? Гораздо корректнее написать условие с использованием отрезков например. Leetcode часто грешит плохим описанием.

  • @lor1k
    @lor1k 2 года назад +1

    Что за фильм во вставке про акции?

    • @frontendscience
      @frontendscience  2 года назад +2

      Хороший год

    • @lor1k
      @lor1k 2 года назад +1

      @@frontendscience спасибо

  • @ghost8652
    @ghost8652 Год назад

    Сначала решил так, как у Автора. Потом вспомнил, что для получения результирующего значения массива есть метод reduce().
    const profit = prices.reduce((acc, cur, index) => acc += (cur > prices[index-1]) ? cur - prices[index-1] : 0, 0);

  • @seryozhamangushev9638
    @seryozhamangushev9638 2 года назад

    Молю!!! Расжуйте микротаски и макротаски в одном из ваших видео. Очень тугая тема.

  • @alicenNorwood
    @alicenNorwood 2 года назад

    2:45
    "...Покупай!"
    "Паршивый жучила он сбил цены и теперь покупает акции по дешевке!! Покупай!!"
    😂😂😂

  • @АнтонСтасюк-е4р
    @АнтонСтасюк-е4р 2 года назад

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