Задача из Собеседования на 160,000 Евро в Год

แชร์
ฝัง
  • เผยแพร่เมื่อ 22 พ.ค. 2024
  • Разбираем популярную задачу, которую спросили у моего знакомого на собеседовании на позицию Senior Software Developer в Берлине.
    После успешного прохождения нескольких собеседований, ему предложили зарплату в 160.000 евро в год.
    Задача состоит в поиске двух чисел из отсортированного массива, в сумме дающих заданное число.
    00:00 Вступление
    00:54 Условие задачи
    02:09 Перебор всех пар
    03:38 HashSet
    06:11 Бинарный поиск
    09:49 Два указателя

ความคิดเห็น • 1.9K

  • @sashalukin
    @sashalukin  25 วันที่ผ่านมา

    Создал Telegram канал, в котором рассказываю о жизни в Лондоне, работе в Google и подготовке к собеседованиям. Подписывайтесь: t.me/saschalukin

  • @user-tp8ku2hp9u
    @user-tp8ku2hp9u 2 ปีที่แล้ว +3785

    -1 и 8 тоже дадут 7 :)

    • @sashalukin
      @sashalukin  2 ปีที่แล้ว +304

      Хехе, точно, не заметил :)

    • @semchic888
      @semchic888 2 ปีที่แล้ว +137

      @@sashalukin а я увидел, но так как профан, подумал что не все условия увидел)))

    • @sashalukin
      @sashalukin  2 ปีที่แล้ว +194

      Так, закреплю коммент, чтобы все увидели) В начале в первом примере тоже два ответа и тоже можно вернуть любой из них.
      Круто, что заметили :)

    • @FariusFriends
      @FariusFriends 2 ปีที่แล้ว +4

      ток хотел написать

    • @user-qm7pl3ez4s
      @user-qm7pl3ez4s 2 ปีที่แล้ว +57

      @@sashalukin я конечно не программист, но почему нельзя например из непосредственно результата "К" начать вычитать числа и сравнивать их с предложенными?

  • @vladnykytenko8394
    @vladnykytenko8394 2 ปีที่แล้ว +33

    Очень рад, что вы вернулись.

  • @user-lu9gz7yf2v
    @user-lu9gz7yf2v ปีที่แล้ว +690

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

    • @pontypilat_0338
      @pontypilat_0338 ปีที่แล้ว +164

      Ппфф легко же. 5 на левой, 5 на правой, значит общее количество 25

    • @Bartolph
      @Bartolph ปีที่แล้ว +16

      @@pontypilat_0338 разве не 30?

    • @carbonara_13
      @carbonara_13 ปีที่แล้ว +115

      изи, 55

    • @MiroSlave1
      @MiroSlave1 ปีที่แล้ว +4

      @@carbonara_13 ты меня опередил

    • @SmihoTvor_lite
      @SmihoTvor_lite ปีที่แล้ว +14

      @@carbonara_13 а разве не жолтый?

  • @fedot0ff
    @fedot0ff 2 ปีที่แล้ว +2

    Комментарий в поддержку канала. Автор, ты молодец, спасибо за труд!

  • @ruslanabishev
    @ruslanabishev 2 ปีที่แล้ว +5

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

  • @user-qz3kw1xd6v
    @user-qz3kw1xd6v 2 ปีที่แล้ว +27

    Хорошее объяснение и понятный код, спасибо. Ждём ещё, удачи в развитии!

  • @grbak
    @grbak ปีที่แล้ว +3

    Топ-видос! Посмотрел и сохранил в один из своих плейлистов еще в феврале, но вернулся и разобрался в последнем варианте решения только сейчас, когда твердо решил апнуть скилл в решении задачек (наткнулся на эту задачу на leetcode). Оказывается, лучшее решение не такое уж нетривиальное, как показалось на первый взгляд

  • @Wild6-8
    @Wild6-8 ปีที่แล้ว

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

  • @user-hj2es2vj6p
    @user-hj2es2vj6p 2 ปีที่แล้ว +10

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

    • @user-sp5fv4kw2n
      @user-sp5fv4kw2n ปีที่แล้ว +1

      Почитай Вирта: Структуры и Алгоритмы, целый мир откроешь

  • @akella512
    @akella512 2 ปีที่แล้ว +3

    Рад, что появилось свежее видео. Интересная задача и подходы к ее решению, доступное объяснение👍💪

  • @kriguitar4753
    @kriguitar4753 2 ปีที่แล้ว +23

    8:44 - тут лучше определить, что является входом и что является выходом нашей части, отвечающей за бинарный поиск и вынести наш бинарный поиск в отдельный компонент. Это как упростит чтение и понимание кода, так и сделает код более модульным. По сути тут происходит тоже самое что и в "HashSet"

  • @Coralinerbx
    @Coralinerbx ปีที่แล้ว +1

    Снимай пожалуйста ещё ролики. У тебя очень хорошо получается. Очень познавательно!!! Спасибо!!

  • @Gremelka9
    @Gremelka9 2 ปีที่แล้ว +3

    С возвращением) спасибо за ролик)

  • @Rewsbt
    @Rewsbt 2 ปีที่แล้ว +15

    Наконец то вы вернулисссссьььььььь

  • @andreipopov2700
    @andreipopov2700 ปีที่แล้ว +3

    Классное видео. Автор все очень доступно и понятно объясняет.
    Саше спасибо большое за труд и терпение к "диванным ворчунам" )))

  • @user-hn3mq8dp5r
    @user-hn3mq8dp5r 2 ปีที่แล้ว +4

    Спасибо, так просто о сложном. Вы талант. Надо клон сделать и учителем в школу.

  • @kovsaw
    @kovsaw 2 ปีที่แล้ว +3

    Очень круто, спасибо за видео!

  • @gitarre_spielen
    @gitarre_spielen 2 ปีที่แล้ว +11

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

  • @jury2753
    @jury2753 ปีที่แล้ว +1

    Супер!!! Спасибо огромное, за классное видео. 👍👍👍

  • @dashkarandash4217
    @dashkarandash4217 2 ปีที่แล้ว

    очень интересный материал, спасибо =) хотелось бы больше подобных видео

  • @user-er9hm1vg6f
    @user-er9hm1vg6f 2 ปีที่แล้ว +10

    Браво! Ваши видео просто замечательные! Продолжайте в том же духе! Хотелось бы узнать больше «инсайдерской» информации, как человеку, которому только предстоит работать :)

    • @nikolaifaist
      @nikolaifaist ปีที่แล้ว

      Ещё не работаешь в этой сфере?

  • @sinsinegobaffa7321
    @sinsinegobaffa7321 2 ปีที่แล้ว +29

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

  • @user-us9os1gp5y
    @user-us9os1gp5y 2 ปีที่แล้ว

    Ураа,ждал твоих роликов давно)

  • @alexeybubakov6885
    @alexeybubakov6885 2 ปีที่แล้ว

    Спасибо! Очень интересно. Подписался. Буду ждать новых видео

  • @justfairytale5722
    @justfairytale5722 2 ปีที่แล้ว +3

    Решал такую на литкоде методом двух указателей left, right как раз. Спасибо за видео

    • @alarmolord
      @alarmolord ปีที่แล้ว

      Я даже не поленился и нашёл. Может кому-то интересно будет порешать такую задачу на leetcode. Задача с уровнем easy (на вход дан неотсортированный массив) "1. Two Sum". И ещё одна похожая задача уровня medium "167. Two Sum II - Input Array Is Sorted" (на вход дан отсортированный массив).

  • @lestwa4265
    @lestwa4265 2 ปีที่แล้ว +8

    Я сначала не поняла решение с двумя указателями, а потом по коду как всё поняла. Очень интересно и хорошо рассказано, пасеба!

  • @withotsoul7252
    @withotsoul7252 ปีที่แล้ว

    Спасибо за видео! Очень интересная задача 👍👍🔥🔥🔥🔥

  • @usernamer519
    @usernamer519 ปีที่แล้ว

    очень интересное и понятное объяснение, топ. спасибо!

  • @AlexZvukov
    @AlexZvukov 2 ปีที่แล้ว +99

    Просто очередной комментарий про то, что надо микрофон-петличку 😉 В целом огонь-пулемёт, продолжай обязательно у тебя отлично получается 💪 12к подписчиков за год на 4 видосах говорит о том, что ты всё делаешь правильно, материал актуальный! Подтяни качество, сделай выпуски регулярными и будет круто. Если это тебе надо конечно 😜

    • @ps-037
      @ps-037 ปีที่แล้ว +3

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

  • @marksreider7645
    @marksreider7645 2 ปีที่แล้ว +3

    Спасибо, круто!

  • @denismerigold486
    @denismerigold486 ปีที่แล้ว

    Cпасибо за интересную задачу!
    хочу ещё!)

  • @user-wq4fc8zv9i
    @user-wq4fc8zv9i 2 ปีที่แล้ว

    Мужик,твой материал на таком легке заходит,учу js,до такого уровня ещё не дошел,но о чем ты рассказываешь понятно,и заходит лайтово, спасибо за труд !

    • @user-yd2wm6gt5k
      @user-yd2wm6gt5k 2 ปีที่แล้ว

      Удачи тебе,юный подаван.

  • @cathello2900
    @cathello2900 2 ปีที่แล้ว +7

    Интересно 👍
    Палец и т.п. за этот видос!
    По больше пожалуйста таких задача ! С разжевыванием и примером. Можно и не только на Алгоритмы.
    Но и более простые на возвраты. На операции логики сравнения и т.п и т.д.
    Вообще Очевидные цифры в особенности по условию - сразу бросаются в глаза.
    Как пример из первого пункта: 8 + (-1)
    Т.е крайние цифры к условию и цифры с отрицательным значением.
    Опять же надо смотреть и на контекст условия..
    Но учитывая последние примеры то как раз таки отрицательные цифры используются.

  • @alxndrnz
    @alxndrnz 2 ปีที่แล้ว +3

    Ура, вернулся :)

  • @user-nb3gw2zf8n
    @user-nb3gw2zf8n 2 ปีที่แล้ว

    Прекрасная подача. Так держать!

  • @igorratnik2357
    @igorratnik2357 2 ปีที่แล้ว

    Спасибо. Доходчиво:) Подписка однозначно за годный контент:)

  • @VPmagicshow
    @VPmagicshow 2 ปีที่แล้ว +3

    Оооочень круто!

  • @Gypuk
    @Gypuk ปีที่แล้ว +10

    Бинарный поиск требует проверки на размер массива, так как при маленьком размере у нас время процессора уходит на математические вычисления середины и проверки (просто пометка от ноунейма).
    Спасибо за видео. Люблю искать возможности для оптимизации. Пока с такими задачами не сталкивался, но если столкнусь, то буду знать, как сделать код быстрым, да ещё и красивым.

  • @rinat_nur
    @rinat_nur 2 ปีที่แล้ว

    Приятно слушать - классная подача

  • @bigtreeSSS
    @bigtreeSSS ปีที่แล้ว

    Круто и интересно, обязательно продолжай.

  • @user-wi4fg7xm2p
    @user-wi4fg7xm2p 2 ปีที่แล้ว +3

    очень полезный алгоритм

  • @slavamobile3733
    @slavamobile3733 2 ปีที่แล้ว +178

    Задача элементарная, двигаем окно и смотрим если сумма меньше, двигаем правую часть, если сумма больше двигаем левую часть.
    На статистике данных по распределению чисел мин, Макс и n можно эмпирически вывести функцию которая весьма точно будет попадать в индекс массива, да ещё давать длинну окна.
    Плюс для отриц и положит, будет два окна

    • @kriguitar4753
      @kriguitar4753 2 ปีที่แล้ว +5

      9:49 - оно и есть. Только одно окно для любых элементов и любого результата суммы
      А вот что делать если 3 слагаемых - пока непонятно.

    • @WillsherT
      @WillsherT 2 ปีที่แล้ว +1

      @@kriguitar4753 воспользоваться решением примера именно из собеседования, чуть доработав, чтобы записываемый ответ слагался с оставшимися в окне элементами.

    • @webblyy
      @webblyy 2 ปีที่แล้ว

      @@kriguitar4753 два указателя + хешсет

    • @KKZ_5000_RUB
      @KKZ_5000_RUB 5 หลายเดือนก่อน

      Отрицательные числа крайне редко в реальных задачах встречаются. Задачи эти теоретики диванные создают.

    • @user-tk7nh1jw3y
      @user-tk7nh1jw3y 4 หลายเดือนก่อน

      @@webblyy 2 указателя уже не нужны если есть хэш-сет

  • @titanovsky
    @titanovsky ปีที่แล้ว

    Спасибо большое, скоро приступлю к таким задачам)

  • @yanazork
    @yanazork 2 ปีที่แล้ว

    Это было очень интересно!)

  • @user-eg7od8nu1u
    @user-eg7od8nu1u ปีที่แล้ว +10

    Я давно забросил программировать но первая мысль была от от 7 вычитать по одному и искать равные ! Последнее решение просто наикрасивейшее!!!

    • @user-kh9rp6tu2b
      @user-kh9rp6tu2b ปีที่แล้ว +3

      Можно так же идти с позиции I+1, чтобы не проверять уже пройденное число

    • @xelnagamex
      @xelnagamex ปีที่แล้ว +1

      последнее решение не работает

  • @user-ri4rk3hn8g
    @user-ri4rk3hn8g 2 ปีที่แล้ว +3

    Круто!

  • @staspanyukov4822
    @staspanyukov4822 2 ปีที่แล้ว

    Отлично объясняешь! Выпускай почаще видео)

  • @user-xp8zi5bs1d
    @user-xp8zi5bs1d 3 หลายเดือนก่อน

    Спасибо!
    Очень интересно и полезно🎉

  • @tomysmit5386
    @tomysmit5386 2 ปีที่แล้ว +4

    Очень круто, ждем еще интересных и реальных задачек)

    • @COOKIEMONSTER90
      @COOKIEMONSTER90 ปีที่แล้ว

      Мне вот эта задача по математике понравилась. Бородатая и не совсем айтишная, но может будет интересно :)
      Встречаются два приятеля - математика:
      - Ну как дела, как живешь?
      - Все хорошо, растут два сына дошкольника.
      - Сколько им лет?
      - Произведение их возрастов равно количеству голубей возле этой скамейки.
      - Этой информации мне недостаточно.
      - Старший похож на мать.
      - Теперь я знаю ответ на твой вопрос.
      Сколько лет сыновьям? (Ответ логичный и однозначный)

  • @ntvisigoth
    @ntvisigoth ปีที่แล้ว +14

    Саша Лукин, спасибо за твой труд! Крайне хорошо поясняешь. Уметь пояснять сложное простыми словами это очень важный и полезный навык. В будущем, мы, люди, все чаще и чаще будем коммуницировать.
    Хотел бы тебя спросить вот о чем: Как ВИДЕТЬ более эффективный вариант чаще? Ведь до этого же надо додуматься! Вот ты привел разные решения, но ведь про них надо было сообразить . Как развивать соображалку то? ;)
    Пока, развитие сооражалки в алгоритмах вижу такой: Ты смотришь как решают другие. В голове откладываются разные подходы. А потом методом брутфорса при решении той или иной задачи пишешь код. Либо ты видишь такую задачу, которая очень похожа на ту, которую ты уже видел ранее и применяешь то, что ты помнишь. Но все это цепляется на знание и на способность мозга вспомнить и увидеть схожие черты с ранее решенной задаче. Есть ли другие способы ?

    • @Dimarious.G
      @Dimarious.G ปีที่แล้ว +12

      Чтобы развивать навык решения задач, нужно решать задачи. Чтобы развивать навык решать задачи эффективно, нужно решать задачи эффективно.
      Итого. Берёшь задачу, САМ решаешь её в лоб, то есть самым примитивным и очевидным способом. Пытаешься найти другие способы (да, сам). Сравниваешь полученные варианты, анализируешь их плюсы и минусы, ищешь слабые места, места, которые можно улучшить и т.д. и т.п. Смотришь, как другие люди решают другие задачи (да-да, именно другие) в поисках вдохновения. Смотришь, не появились ли ещё идеи, которые можно применить к своей задаче. Когда ты уже сдедал всё, что мог сделать сам, тогда и только тогда можно смотреть, как другие решают такие же задачи. Тогда будет развитие, а если просто смотреть на других, хоть и на лучших, ну хз... Сильно ли накачаешься, наблюдая за тем, как сильные силачи тягают железо? Вопрос риторический.
      Можешь не благодарить 😌

    • @byesedd
      @byesedd 5 หลายเดือนก่อน

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

    • @byesedd
      @byesedd 5 หลายเดือนก่อน

      @@Dimarious.Gа так думаю ты прав в остальном

  • @Pavlo_Synytsia
    @Pavlo_Synytsia ปีที่แล้ว +1

    спасибо, интересно и познавательно

  • @user-rj2pq9jk5w
    @user-rj2pq9jk5w ปีที่แล้ว

    Спасибо большое за информацию)

  • @infomail8550
    @infomail8550 2 ปีที่แล้ว +7

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

    • @user-bx5ze4jw5p
      @user-bx5ze4jw5p 2 ปีที่แล้ว

      Чего такого в яве то? возможно выбран как один из хорошо читаемых языков. напиши на питоне, уже не каждый поймет.

  • @iloginu
    @iloginu ปีที่แล้ว +4

    Вначале подумал и придумал вариант такой: берем первый и суммируем с последним. Если больше К, то берем предпоследний и тд. Ползем назад сравнивая с первым. Потом берем второй и опять сравниваем с последним, идя навстречу второму. О том, что последний можно не сбрасывать почему-то не додумался )

  • @NikolayMishin
    @NikolayMishin ปีที่แล้ว

    была такая задача в Яндексе))
    спасибо за разбор, супер!

  • @Coralinerbx
    @Coralinerbx ปีที่แล้ว

    Спасибо большое!! Вы молодец!

  • @user-xw8ur4sc6t
    @user-xw8ur4sc6t 2 ปีที่แล้ว +6

    лукас не глядя. давно ждал возвращения))

  • @eugen7965
    @eugen7965 ปีที่แล้ว +15

    В втором решении тоже два цикла. Второй скрыт - это поиск в хешсете (скрытый
    перебор по нему)

    • @Z3rgatul
      @Z3rgatul ปีที่แล้ว +4

      Чего??? Поиск в хешсете О(1)

    • @sergeifomin3225
      @sergeifomin3225 ปีที่แล้ว +2

      @@Z3rgatul sets (аналог C++ std::unordered_map), Dictionary и Tuple (аналог std::map в C++) контейнеры для хранения списка ключей реализованы на базе бинарного дерева (сложность поиска log(n)). Хз. Почему во всех мануалах python написано O(1). Может кто объяснит?

    • @Z3rgatul
      @Z3rgatul ปีที่แล้ว

      @@sergeifomin3225 кто сказал что set в python это бинарное дерево? там hashtable

    • @rasimbot
      @rasimbot ปีที่แล้ว +1

      @@sergeifomin3225 | Нет, unordered_set и unordered_map это хэш-таблицы с O(1). Не дерево

  • @EliJahMCI
    @EliJahMCI 9 หลายเดือนก่อน

    Интересно, спасибо за контент

  • @nurlybekmardanov5486
    @nurlybekmardanov5486 2 ปีที่แล้ว

    Рад, что ты вернулся!

  • @kselnaag2482
    @kselnaag2482 2 ปีที่แล้ว +7

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

    • @sashalukin
      @sashalukin  2 ปีที่แล้ว +3

      Спасибо :)
      С опытом придет, если до этого решил 10 задач на два указателя, то и в 11 увидишь.
      Если хочешь потренить, то вот сайт, на нем все к собесам готовятся:
      leetcode.com/problemset/all/?topicSlugs=two-pointers
      Решай easy задачи, и если не можешь придумать решение (а так в начале всегда будет), то смотри в комментах (секция Discuss). Удачи!

    • @hacamadahimichiru6110
      @hacamadahimichiru6110 2 ปีที่แล้ว

      Подскажите, пожалуйста, по алгоритмам годные источники. И по структурные данным, если можно

    • @kselnaag2482
      @kselnaag2482 2 ปีที่แล้ว

      @@hacamadahimichiru6110 Сам сейчас прохожу направление CS от Принстона на Курсере (от профессора Седжвика). Еще хвалят курс CS50 от Гарварда, но сам не пробовал. Все бесплатно и в интернете. Гуглите.

    • @hacamadahimichiru6110
      @hacamadahimichiru6110 2 ปีที่แล้ว

      @@kselnaag2482 спасибо!

  • @olafk2628
    @olafk2628 2 ปีที่แล้ว +19

    Спасибо! Мне кажется, не лишним будет упомянуть, что сортировка это в среднем еще плюс O(n log n) по времени к оценке сложности, если изначально массив не отсортирован.

    • @sashalukin
      @sashalukin  2 ปีที่แล้ว +8

      Ага, и часто эту задачу дают в виде неотсортированного массива, где нужно найти 3 числа, в сумме дающих k.
      В таком случае просто в начале сортируем массив, потом пишем цикл прохода по массиву (это будет первое число из 3), а второе и третье каждый раз пытаемся найти методом двух указателей как в видео.
      Тогда время будет O(n^2) и O(n log n) от сортировки не влияет на итоговую сложность.

    • @dimapimenov6807
      @dimapimenov6807 2 ปีที่แล้ว +2

      Нет, в таком случае алгоритм работать не будет
      Пример: [0, 3, 2], к=3
      Тогда начальная пара (0, 2) в сумме даст меньше, чем надо, и следующая пара для рассмотрения будет (3, 2)

    • @Boosty931
      @Boosty931 2 ปีที่แล้ว +2

      @@dimapimenov6807 у тебя не сортирован массив. После сортировки все будет ок.

    • @dimapimenov6807
      @dimapimenov6807 2 ปีที่แล้ว +5

      Ну так и вопрос был про несортированный массив и алгоритм на нем

    • @dimapimenov6807
      @dimapimenov6807 2 ปีที่แล้ว

      Если я вообще правильно понял вопрос... Я решил что вопрос про метод 2х указателей

  • @el_dorado
    @el_dorado 2 ปีที่แล้ว

    Спасибо, я только начал подступаться к программированию. Ничего еще не знаю, но все равно интересно.

  • @andrewteterin975
    @andrewteterin975 ปีที่แล้ว

    Приятно слушать. Да ещё и Java)) спасибо

  • @user-pv1ol1vc8k
    @user-pv1ol1vc8k ปีที่แล้ว +166

    Любопытно, что некоторые задания из ЕГЭ сложнее, чем реальная задача с собеседования )

    • @vladislavbaranovskii4133
      @vladislavbaranovskii4133 ปีที่แล้ว +22

      это же хорошо, подготовился к проф ЕГЭ, и можешь идти в гугл

    • @Grim_J0nes
      @Grim_J0nes ปีที่แล้ว +8

      Да, если не учитывать бэкграунд кандидата(опыт работы с платформами, модулями и тд), выпускник ЕГЭ подходит)

    • @dmitry7464
      @dmitry7464 ปีที่แล้ว +2

      Задания из ЕГЭ по информатике?

    • @abcdefghi1489
      @abcdefghi1489 ปีที่แล้ว +3

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

    • @Whitestarwhitestar
      @Whitestarwhitestar ปีที่แล้ว +3

      ​@@abcdefghi1489 на ЕГЭ тоже стресс не маленький)

  • @russellstar
    @russellstar 2 ปีที่แล้ว +390

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

    • @realvall
      @realvall 2 ปีที่แล้ว +130

      Только из-за того, что задачки порешал, платить конечно не будут. Это условие обязательное, но не достаточное. А вот если задачки не порешал, то деньги ТОЧНО не будут платить.

    • @sovaz1997
      @sovaz1997 2 ปีที่แล้ว +101

      @@realvall и тем не менее, данная задача не скажет ничего от слова совсем (т. е. 0%) по поводу уровня программиста. Соответственно, самый правильный способ - убрать эту задачу из собеседования и оставить олимпиадникам

    • @anti_middle_ages
      @anti_middle_ages 2 ปีที่แล้ว +10

      @@sovaz1997
      Ну тебе виднее)

    • @realvall
      @realvall 2 ปีที่แล้ว +61

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

    • @QuickCube
      @QuickCube 2 ปีที่แล้ว +3

      @@sovaz1997 если будете пробовать трудоустраиваться в yandex, там будет много таких и более сложных задач. Если пойдёте в дойче банк, то они тоже несколько задач подобных давали.

  • @CoS1NuS1
    @CoS1NuS1 ปีที่แล้ว

    Большое спасибо! Очень интересно )

    • @user-qy7vv5yx3b
      @user-qy7vv5yx3b ปีที่แล้ว

      Я бы сказал формализовать вообще всё.

  • @AAzamdjon
    @AAzamdjon ปีที่แล้ว

    Это работает если нужно найти лишь одну пару чисел.
    Но больше спасибо за объяснение. Очень легко воспринимается такая подача!)

  • @digimax1288
    @digimax1288 2 ปีที่แล้ว +5

    Здорово, не занимаюсь программированием, никак не решаюсь начать, но настолько четкое объяснение, что понял даже я. Спасибо!

    • @sashalukin
      @sashalukin  2 ปีที่แล้ว +2

      Спасибо! А программирование начать учить никогда не поздно, сейчас очень много моих друзей не из айти переходят в айти. Только время нужно выделить, я бы ориентировался хотя-бы на год, если довольно плотно заниматься.
      Удачи!

    • @digimax1288
      @digimax1288 2 ปีที่แล้ว

      @@sashalukin спасибо большое за совет и напутствие

    • @AVS11176
      @AVS11176 2 ปีที่แล้ว

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

    • @digimax1288
      @digimax1288 2 ปีที่แล้ว

      @@AVS11176 я вообще в банке работаю на данный момент, ну и как везде, 70% работы это эксель и какое-то статистическое ПО (типо R, у нас САС). То когда я залезал в VBA или в SAS все смотрели как на мага-чародея

  • @yury497
    @yury497 2 ปีที่แล้ว +3

    Последнее решение даже не пришло в голову, пока не зашла речь про указатели, но чёрт возьми, оно такое простое и офигенное!

  • @user-iq2nq7cj6l
    @user-iq2nq7cj6l ปีที่แล้ว

    Спасибо, очень интересно!

  • @user-hd9hw7nl1n
    @user-hd9hw7nl1n ปีที่แล้ว

    отличный контент и подача материала !! единственное упущение, мало роликов ((

  • @hotKorzhik
    @hotKorzhik 2 ปีที่แล้ว +33

    Саша, привет! Большое спасибо за разборы задач. То, что ты делаешь - круто. Успехов тебе и каналу, продолжай. У меня вопрос: у тебя есть контактная почта или другие каналы связи? Хотелось бы написать: узнать и задать буквально пару вопросов про твой опыт переезда айтишника в Индонезию. Успехов!

    • @romanbykov5922
      @romanbykov5922 ปีที่แล้ว +1

      сочувствую вам, если вы считаете, что ЭТО - круто...

  • @djangodev3191
    @djangodev3191 2 ปีที่แล้ว +4

    Недавно подписался и вот

  • @OlegTar
    @OlegTar 2 หลายเดือนก่อน

    3:03 - i должно идти до i < nums.length - 1, так как следущий цикл начинается с j=i+1

  • @aleks3954
    @aleks3954 2 ปีที่แล้ว

    шикарный разбор

  • @viacheslavmatveichev4039
    @viacheslavmatveichev4039 2 ปีที่แล้ว +10

    Здравствуйте! Спасибо большое за разбор.
    Задача интересная и довольно популярная. Но отдельный интерес вызывает именно математическое обоснование данного алгоритма. А именно: доказать, что решение найдется при движении именно левого поинтера, когда сумма меньше и правого, когда сумма больше.
    Не сможете помочь разобрать? Обоснование порой спрашивают чаще, чем сам алгоритм. Спасибо!

    • @bpht618
      @bpht618 2 ปีที่แล้ว

      массив упорядочен, поэтому. Если сумма меньше k мы сдвигаем левый указатель и теперь он указывает на большее число, а если больше чем k двигаем правый и он указывает на меньшее число.

    • @viacheslavmatveichev4039
      @viacheslavmatveichev4039 2 ปีที่แล้ว

      @@bpht618 , здравствуйте. Да, я согласен, интуитивно и логически алгоритм полностью понятен. Но хочется именно математически обоснование/доказать в более менее лаконичной форме.
      Возможно надо просто действовать от противного и на каком-то шаге N показать, что иной суммы нет, потому что иначе бы мы ее точно встретили на шаге К

    • @sashalukin
      @sashalukin  2 ปีที่แล้ว +6

      Я бы доказывал через инвариант (условие, которое выполняется изначально и сохраняется после каждой итерации цикла).
      Инвариант: все элементы массива с индексами < l, а также с индексами > r точно нам не подходят.
      Изначально это условие выполняется, потому что элементов массива с индексами меньше 0 или больше nums.length-1 нет.
      При каждой итерации мы считаем сумму элементов. Так как массив отсортирован, то по нашему инварианту arr[r] - максимальный по значению элемент среди всех тех, которые потенциально могут быть в ответе.
      Если arr[l] + arr[r] < k, то arr[l] + arr[i

    • @sashalukin
      @sashalukin  2 ปีที่แล้ว +4

      Но в Гуглах-Амазонах крайне редко спрашивают доказательства. Там все очень структурированно, т.е. есть четкие правила, по которым идут собеседования и правила, по которым они оцениваются. Грубо говоря, это решил/не решил задачу, придумал оптимальное/не оптимальное решение, написал код без багов/с багами, и.т.д. Но объяснить простыми словами, почему решение работает, конечно, нужно.
      А в наших компаниях это любят, согласен. Меня несколько раз просили доказать какие-то штуки, самым популярным было, что добавление элемента в динамический массив работает в среднем за О(1).
      www.quora.com/Do-I-need-to-study-mathematical-proofs-in-algorithms-for-a-software-engineer-interview-with-Facebook-Google

    • @viacheslavmatveichev4039
      @viacheslavmatveichev4039 2 ปีที่แล้ว

      @@sashalukin спасибо! Да, Вы правы, такие вопросы на математические доказательства/обоснования мы получали именно в наших компаниях… интересно :) всего доброго, с нетерпением ждём новых выпусков! :)

  • @enternickhere
    @enternickhere 2 ปีที่แล้ว +3

    Здравствуйте! Спасибо за видео). Вопрос не совсем по теме: какая основная разница между массивом и коллекцией, которая позволяет "одновременно" перебирать все ее элементы?

    • @user-yf8jf3fo2x
      @user-yf8jf3fo2x 2 ปีที่แล้ว +1

      Не совсем понятно что значит "одновременно" перебирать все ее элементы. Collection наследуется от Iterable т.е. все коллекции позволяют перебирать, если речь об этом. Могу предположить что речь идет о том что массивы фиксированной длины, а реализации интерфейса Collection динамической, т.е. увеличиваются по мере добавления элементов. Массив также используется под капотом некоторых реализаций интерфейса Collection например ArrayList и частично HashSet. Ну т.е. более простой базовый объект для более сложных структур данных. В контексте задачи наверное речь про то что поиск по HashSet за О1 а не за On как у массива отсюда и ускорение.

    • @enternickhere
      @enternickhere 2 ปีที่แล้ว +1

      Да, меня заинтересовало то, что сложность использования коллекции - О(1), а не О(n). То есть коллекция способна перебирать элементы настолько быстро, что время, затраченное на перебор, считается постоянным?

    • @user-yf8jf3fo2x
      @user-yf8jf3fo2x 2 ปีที่แล้ว +1

      @@enternickhere почитайте "как работает HashMap в джава". элементы там хранятся в массиве связанных списков или массиве бинарных деревьев. Индекс массива вычисляется(а не перебирается) в зависимости от содержимого элемента при его помещении. И также потом при его поиске и извлечении.

    • @enternickhere
      @enternickhere 2 ปีที่แล้ว +2

      Почитал, понял)

  • @leomysky
    @leomysky 11 หลายเดือนก่อน

    Круто и очень понятно, спасибо

  • @egorlazuka770
    @egorlazuka770 ปีที่แล้ว

    Гениальное решение, спасибо)

  • @johnmurdoch8368
    @johnmurdoch8368 ปีที่แล้ว +3

    Та что уж там.. на миллион евро год

  • @kisoonx
    @kisoonx ปีที่แล้ว +6

    Во втором варианте все равно время работы O(n^2), так как поиск в хэшсете - тоже представляет из себя внутренний цикл еще и со сравнением входящего значения..., отличие лишь в том, что количество пар теперь образуется реверсивно на увеличение лесенки, а не на уменьшение как с двумя циклами, так еще и больше на одну пару становится: -3 и пусто, а уж потом 0 и -3, 1 и -3, 1 и 0. Явой не занимаюсь, могу лишь предположить, что просто поиск в хэшсете работает быстрее, чем функция for, но не забываем про время обращения к памяти , если работать с большим объемом + постоянное пополнение хэшсета - это тоже еще одно действие, на которое тратится время. Вообще плохо считать время выполнения по формуле, которая опирается только на количество данных)

    • @OdinKG
      @OdinKG ปีที่แล้ว +1

      >>"Во втором варианте все равно время работы O(n^2)"
      Именно так, но видимо автор является очень "современным" программистом, т.е. о том, что внутри происходит особо не задумывается.

    • @ruslibertarian
      @ruslibertarian ปีที่แล้ว

      Логарифмическое время там должно быть на поиск. Пополнение за константу. Те сложность должна быть n + log(n)

  • @maksigors
    @maksigors 8 หลายเดือนก่อน

    отличное видео, спасибо)

  • @user-lb2bw8xc2y
    @user-lb2bw8xc2y 2 ปีที่แล้ว

    Спасибо, очень помогло!

  • @blushingpie
    @blushingpie 2 ปีที่แล้ว +3

    (Во втором примере) Разве проверка наличия элемента а массиве равна O(1)? Мне кажется, что больше на O(n) похоже, тогда алгоритм будет О(n^2)?

    • @user-fu7ox7ml2u
      @user-fu7ox7ml2u ปีที่แล้ว +1

      Тож заметил) set.contains написал и радуется)

  • @user-pp6zi7lz7s
    @user-pp6zi7lz7s 2 ปีที่แล้ว +19

    В первом варианте нужно добавить проверку: если сумма двух чисел больше К, то вернуться в начало первого цикла, потому что дальнейшие суммы будут также больше К, т.к. массив отсортирован.
    В варианте с бинарным поиском при делении на две части нужно использовать целочисленное деление на 2, потому что в какой-то момент программа будет пытаться найти элемент с не целым номером индекса, например, 6,5.

    • @user-wn2vu9jb3x
      @user-wn2vu9jb3x 2 ปีที่แล้ว +9

      Делится тип Integer. Он при делении дает целочисленное значение без остатка. Пример: 13/2 = 6;

    • @Rameronos
      @Rameronos ปีที่แล้ว

      Java, в отличии от всяких питонов и js, строго типизированный язык и в нём исключено получить дробное значение при делении целых чисел, если явно это не указывать. При этом, результат деления всегда округляется до меньшего числа. То есть даже если провести операцию, к примеру, 59 / 10, то результат будет 5. Однако, если хотя бы одно из делимых чисел привести к дробному типу, вроде (float)59 / 10 или 59.0 / 10, то результат вычисления уже будет 5.9.

    • @XEL234234234234
      @XEL234234234234 ปีที่แล้ว +2

      @@Rameronos не округляется до меньшего, а отбрасывается дробная часть - разницу хорошо видно если делить на 10 не 59, а минус 59

    • @DadundddaD
      @DadundddaD ปีที่แล้ว

      Зачем целочисленное деление, если есть битовый сдвиг? Или в джава он под запретом?

    • @DadundddaD
      @DadundddaD ปีที่แล้ว

      ​@@Rameronosпитон тоже строго типизирован, но динамически.

  • @sofiabelousova8586
    @sofiabelousova8586 2 ปีที่แล้ว

    Ой, кажется, я влюбилась)
    Я далеко не разработчик (всего лишь МП), но было понятно и интересно)
    Тоже заметила в начале про две пары, дающие правильный ответ)

  • @AlexanderBogachuk
    @AlexanderBogachuk 2 ปีที่แล้ว

    А. Бал. Деть. Узнал много нового. Спасибо!

  • @user-wh5mg4fh4k
    @user-wh5mg4fh4k 2 ปีที่แล้ว +100

    Видимо действительно с программистами вообще напряг последнее время, раз такие задачи на собеседовании дают.

    • @lsentinell
      @lsentinell ปีที่แล้ว +3

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

    • @mijlenium
      @mijlenium ปีที่แล้ว +1

      @@lsentinell Меня на собеседование на 440к рублей в месяц попросили вычислить координаты дрона, уже активно движущегося по заданной траектории, которая стабилизируется с использоваием фази логики с коэффициентом упреждения 0.4 относительно параллельной связки формации, изображающих некую геометрическую фигуру. Из доступных данных - координаты в текущий и следующий момент ведущего дрона из 2й формации, координаты предыдущей секунды "оператора" во 2й формации и текущая позиция на общем маршруте (геометрическая фигура задаётся в виде csv документе в виде уравнений) 2й формаци
      Т.е. По факту дано всё, но ничего )00)) И даже источника сигнала нет, чтобы с помощью драйвера выяснить что там творит отдельно взятый дрон. Его нужно подстроить под параллельно движущуюся формацию. А проектным заданием, которым я сейчас занимаюсь - нужно научить дроны вовремя разлетаться, чтобы впускать в свой строй новую единицу, которая не сломает всю картину
      И это на зп всего за 7 тысяч вечнозелёных ))
      Собираю манатки, еду в амазон в гл офис )0))

  • @user-ve2uo7wk6u
    @user-ve2uo7wk6u 2 ปีที่แล้ว +5

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

    • @trurbomail
      @trurbomail 2 ปีที่แล้ว +5

      Это кодеры, они математику не учат )))))

    • @user-ng7zh9cl2f
      @user-ng7zh9cl2f 2 ปีที่แล้ว

      В тактах какого именно процессора, гражданин умник?
      У тебя хватит пальцев перечислить процессоры и архитектуры, для которых результаты будут разными?

    • @user-ve2uo7wk6u
      @user-ve2uo7wk6u 2 ปีที่แล้ว +2

      @@user-ng7zh9cl2f Что вы знаете об ассемблере?
      Современные программисты, извините, это рукожопы, составляющие программы из кубиков --- кем-то написаных готовых функций. И вот он например, в своём алгоритме использует функцию перемещения в конец массива. А эта функция, вполне возможно, тупо переписывает данные из массива по одному в новый массив, и это нифига не быстрее.

    • @unsafecsharp
      @unsafecsharp 2 ปีที่แล้ว +2

      @@user-ve2uo7wk6u Да, с большими массивами еще и кэшмиссы легко получить. Думаю, что на собесах имеет смысл рассказывать о плюсах-минусах каждого решения, начав с самого очевидного. А вообще да, сегодняшние программисты в основном кодеры.

  • @YKupriyanov_
    @YKupriyanov_ 4 หลายเดือนก่อน

    Саша главное твоя подача! Красавчик

  • @sibedir
    @sibedir 2 ปีที่แล้ว +4

    так ведь в set.contains еще один цикл есть. Причем его длина растёт. Так что в итоге проходов больше чем n.

    • @vladimir2208
      @vladimir2208 2 ปีที่แล้ว +1

      Тоже не понимаю, это вроде как жадный алгоритм, у него сложность, в худшем случае, может быть и O(n*log_n), если не ошибаюсь. Но точно больше n

    • @sibedir
      @sibedir 2 ปีที่แล้ว

      @@vladimir2208 n^2. Проходов будет столько же, сколько и в первом варианте. Разница только в том, что в первом второй цикл от i+1 до n, а во втором - от 0 до i-1.

    • @user-hg3wh1sm8k
      @user-hg3wh1sm8k 2 ปีที่แล้ว

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

    • @sibedir
      @sibedir 2 ปีที่แล้ว

      @@user-hg3wh1sm8k ну да, каждый запрос - это O(n). Да ещё и формирование таких запросов тоже O(n). Вот и получится O(n^2).

    • @user-hg3wh1sm8k
      @user-hg3wh1sm8k 2 ปีที่แล้ว

      @@sibedir не каждый запрос это O(n)
      Всё обращения к множеству суммарно работают за O(n)
      Для доказательства этого советую лекции по хешированным структурам на ютубе, или просто почитать neerc
      То есть, в написанной программе есть запросы к сету, работающие за линию суммарно, и остальные выче
      Остальные вычисления - линейны, складываем (не умножаем! Каждый запрос не работает за линию!), получаем тоже линию

  • @user-eb2kh4df6r
    @user-eb2kh4df6r 2 ปีที่แล้ว +4

    Во втором варианте, все же, оценка не совсем верная. O() -оценка в ХУДШЕМ случае, а не в среднем. В ХУДШЕМ случае (если хеш-функция - хреновая), сложность будет O(n log n). Другое дело, что для int хэш известен. И в конкретном случае с int - все будет верно - O(n), но стоит заменить тип (самое простое обобщение), как все станет совсем не очевидно

    • @griglog1309
      @griglog1309 2 ปีที่แล้ว

      Тип не имеет значения, коллизии будут всегда. С int'ами тоже вполне можно упереться в nlogn.

    • @user-hg3wh1sm8k
      @user-hg3wh1sm8k 2 ปีที่แล้ว

      Суммарно n запросов к хеш таблице будут иметь сложность O(n)
      И худший случая - линия, кажется, а не логарифм. Однако оценку на среднее время выполнение операции в O(1) можно доказать.

    • @griglog1309
      @griglog1309 2 ปีที่แล้ว

      @@user-hg3wh1sm8k Ты не понял, сложность обращения к хэш-таблице в джаве - O(log(n)) в худшем случае

    • @user-hg3wh1sm8k
      @user-hg3wh1sm8k 2 ปีที่แล้ว

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

    • @user-hg3wh1sm8k
      @user-hg3wh1sm8k 2 ปีที่แล้ว

      @@griglog1309 а какой худший случай времени работы одной операции, линия или логарифм, пока что не понял. Кажется, что использование хеш таблицы обычно дает линию в худшем случае, но могу ошибаться.
      В любом случае, суммарное время работы будет всегда линейным, а я ответил на комментарий, где автор оценивает асимптотику как O(nlogn)

  • @eugenedukatta9355
    @eugenedukatta9355 2 ปีที่แล้ว +2

    Понравилось грамотная подача, четкая и чистая речь без эээ-каний, без слов-паразитов, без соплей. Так держать, удачи!

  • @PavelKuritsyn
    @PavelKuritsyn ปีที่แล้ว

    поиск индекса по значению (k-i)... но досмотрю до конца.
    Досмотрел, остаюсь при своем для первой части задачи. Вторая часть интересней, бинарный поиск для ее решения подходит лучше. Спасибо!

  • @pom001
    @pom001 2 ปีที่แล้ว +4

    А разве hashset не использует цикл внутри себя для поиска элемента в массиве?

    • @alex.lokhman
      @alex.lokhman 2 ปีที่แล้ว

      Нет, он высчитывает нужный индекс массива по ключу и просто возвращает данные по этому индексу

    • @unsafecsharp
      @unsafecsharp 2 ปีที่แล้ว +1

      @@alex.lokhman Ага, пока коллизий нет, да там все "просто", а вот если есть...)

  • @FRONT_DOBRA
    @FRONT_DOBRA ปีที่แล้ว +3

    Главный вопрос на собеседовании в икее: чей Крым?

  • @user-ds1sp8wt1u
    @user-ds1sp8wt1u ปีที่แล้ว

    Очень понравилось объяснение - доходчиво и наглядно!
    Есть еще вариант: вычитать из требуемого числа последовательно один элемент массива и пробегаться по оставшемуся массиву в поисках такого же результата. Тоже не требует лишней памяти и также работает в O(n)

    • @SayXaNow
      @SayXaNow ปีที่แล้ว +1

      Это займет O(N^2) никак не O(N)

    • @user-ds1sp8wt1u
      @user-ds1sp8wt1u ปีที่แล้ว

      @@SayXaNow да, точно
      Тогда вариант с вычитанием отпадает

  • @olegnikitindev
    @olegnikitindev ปีที่แล้ว

    Хорош! Спасибо