JavaScript - 6 задач на собеседовании + решение

Поділитися
Вставка
  • Опубліковано 22 гру 2024

КОМЕНТАРІ • 104

  • @eldarkurmanaliev7130
    @eldarkurmanaliev7130 Рік тому +13

    вместо создания объекта и потом вызова метода forEach, можно сразу использовать reduce, где начальное значение будет объект

  • @andrewdefould1453
    @andrewdefould1453 Рік тому +17

    Вторая задача решается в 1 строку - [...new Set(myFruits)], Set это коллекция уникальных значений, которая на вход как раз принимает перебираемый обьект, коим и является массив, далее с помощью спред оператора разворачивает Set в новый массив

    • @Илья-к6е5и
      @Илья-к6е5и 10 місяців тому +5

      Нет.
      Тебе запросто скажут на собеседовании реши руками.

    • @SerzhNesteruk
      @SerzhNesteruk 9 місяців тому +2

      Третья тоже одной строкой решается:
      Object.groupBy(list, ({ age }) => age)
      Та и пятую можно проще решить:
      friends.flatMap(({ pizzas }) => pizzas)

    • @TMANandMAISON991
      @TMANandMAISON991 6 місяців тому

      @@Илья-к6е5и да и нахер их послать сразу можно)

    • @efimovmaksim
      @efimovmaksim 4 місяці тому

      в пятой еще и уникальные было бы не плохо иметь, а не все подряд

  • @alenache1
    @alenache1 Рік тому +8

    2-ая задача: Array.from(new Set(array))

    • @nhrafun
      @nhrafun Рік тому +1

      Пффф [...new Set(myFruits)] Спред? Не, не слышал

    • @alenache1
      @alenache1 Рік тому

      @@nhrafun под капотом там одно и то же

    • @GonzaVladimir
      @GonzaVladimir Рік тому

      @@nhrafun я не проверял, но вроде как этот код выведе не только одно уникальное, а все которые встречаются. тоесть [1,1,2,2,3,4,5]. выведет 1 2 3 4 5. проверьте, не хочу сам

    • @nhrafun
      @nhrafun Рік тому

      @@GonzaVladimir изучите работу Set() и проверка не будет иметь смысла

    • @GonzaVladimir
      @GonzaVladimir Рік тому

      @@nhrafun ты хочешь сказать, что код [...new Set(myFruits)] покажет верно? тогда изучи сам иди

  • @eg0ist_665
    @eg0ist_665 Рік тому +5

    function uniqueItem(arr){
    return Array.from(new Set(arr))
    } решение для уникального значения в одну строчку

    • @8020Coding
      @8020Coding Рік тому

      обычно на собесе тебя попросят решить данную задачу не используя new Set()

    • @d1m.a77
      @d1m.a77 Рік тому +1

      ​@@8020CodingНасколько я наслышан, знания методов это показатель компетентности, как по мне тоже показался нелепым вариантом использовать пару ключ-значение.

    • @Илья-к6е5и
      @Илья-к6е5и 10 місяців тому

      Нет

  • @СтаниславГорячев-г1ъ

    Спасибо за подобный контент, очень полезно 👍

    • @stackdev
      @stackdev  Рік тому

      Спасибо за поддержку!

  • @АрчибальтГугенов

    Добрый день! Что вернет эта функция?
    function getObject(arr) {
    return arr.reduce((a, c) => a[c] ? a[c]++ : a[c] = 1, {})
    }

    • @evgen1584
      @evgen1584 10 місяців тому +1

      1, она работает неправильно, нужно писать через return a

  • @alenache1
    @alenache1 Рік тому +4

    6-ая [...myStr].reduce((prev,next)=>next+prev)

  • @АрчибальтГугенов

    Спасибо за задачи!

  • @dsmorodiny
    @dsmorodiny 4 місяці тому

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

  • @oppositus
    @oppositus 11 місяців тому

    3-я задача аналогична 1-й. Нужно использовать Map, где ключ - возраст, значение - массив имён

    • @SerzhNesteruk
      @SerzhNesteruk 9 місяців тому +1

      По условиям задачи на выходе у нас должен быть объект, поэтому можно просто использовать нативный метод groupBy объекта Object:
      list => Object.groupBy(list, ({ age }) => age)
      Да, аналогичный метод есть и у Map 🤓

  • @stepankormilin7147
    @stepankormilin7147 6 місяців тому

    j < nums.length - 1

  • @whiteguards43
    @whiteguards43 Рік тому

    Смысл в той задаче, где нужно найти nums, target ?Если решаешь ее через двойной цикл, который равен o(n2)?

  • @ПавелРубан-е5м
    @ПавелРубан-е5м 7 місяців тому +1

    4 задача, решение автора - квадратичная сложность (On^2) - тк двойной проход
    Почти все подобные задачи можно решить в один проход за On ,смотря в сторону использования мапы (обьект вспомогательный)
    const numbers = [3, 5, -4, 8, 11, 1, -1, 6];
    const sum = 10;
    const map = {};
    const fn = (numbers, sum) => {
    let result;
    for (let index = 0; index < numbers.length; index++) {
    const number = numbers[index];
    if (map[sum - number]) {
    result = [sum - number, number];
    index = numbers.length - 1;
    }
    if (!map[number]) {
    map[number] = sum - number;
    }
    result = [];
    }
    return result;
    };
    console.log(fn(numbers, sum));

  • @znakjj
    @znakjj Рік тому

    Какая цветовая тема используется на видео?

  • @Sergei546
    @Sergei546 9 місяців тому +1

    спасиб, топчик

  • @alenache1
    @alenache1 Рік тому +8

    очень расточительно решаешь задачи)) на 5-ой задаче на каждой итерации создаешь новый массив, это дорого и долго. Можно было так: let arr=[]; for(item in friends){arr.push(item.pizzas)}; arr=arr.flat(2)

    • @alenache1
      @alenache1 Рік тому +1

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

    • @alenache1
      @alenache1 Рік тому

      @@romanbrandt7986 все, иди кури

    • @alenache1
      @alenache1 Рік тому

      @@romanbrandt7986 когда И ЕСЛИ ты вдруг начнешь работать разработчиком, до тебя рано или поздно дойдет, что все задачи надо решать гигиенично и архитектурно в плане кода и оптимально в плане задействования ресурсов, это на автомате у тебя будет работать. Если не будет, ты выбрал не ту профессию, у тебя нет инженерного мышления. Так что иди учись) пока твои вопросы говорят, что ты этого не понимаешь)

    • @user-fz9vb3if1k
      @user-fz9vb3if1k Рік тому

      @@romanbrandt7986 вот ты его расчехлил😆😆😆, надо было оставит, пусть повыделывается))

    • @Эдди-д1ц
      @Эдди-д1ц Рік тому

      @@romanbrandt7986 то что ты поставил после места работы скобочки намекает на то что ты врешь) доказать сможешЬ?

  • @zergzerg4844
    @zergzerg4844 11 місяців тому

    Если в js прокатывает динамическое соддание ключей для объектов то в typscript нет, он ругается. В объекте есть механизм которые позволяет добавлять новые ключи со зданчением или тогда уже лучше пользоваться Map или Set?

    • @TMANandMAISON991
      @TMANandMAISON991 6 місяців тому

      можно сделать луп по всем возрастам и создать ключи для каждого возраста, при этом значением можно задать null или пустой массив, как удобнее

  • @oppositus
    @oppositus 11 місяців тому

    4-я задача. Можно и так, но есть алгоритм быстрее (это нужно просто знать). Создаем 2-й массив из первого - из каждого элемента вычитаем искомое число (здесь 10) и ищем в исходном массиве число, противоположное полученному. При сортировке обеих массивов получим сложность O(n * log n), а не O(n^2).

    • @SerzhNesteruk
      @SerzhNesteruk 10 місяців тому +2

      Вполне возможен и вариант решения со сложностью алгоритма по времени O(n). Например, вот такой:
      const findFirstPairOfTerms = (arr, sum) => {
      const lib = new Set();
      for (const num of arr) {
      const diff = sum - num;
      if (lib.has(diff)) {
      return [diff, num];
      }
      lib.add(num);
      }
      return [];
      };

  • @viacheslav-dev-pro
    @viacheslav-dev-pro Рік тому

    task two
    const uniqueItems = (list) => {
    const res = list.filter((item, index) => list.indexOf(item) === index);
    return res;
    };
    console.log(uniqueItems(fruits));

    • @SerzhNesteruk
      @SerzhNesteruk 10 місяців тому

      Спасибо, что поделились своим решением. 🙂 Весьма интересное. 👍 Хотя, мне кажется, что применение здесь цикла (indexOf) в цикле (filter) означает максимальную сложность алгоритма по времени O(n²). Поэтому производительность функции будет неизбежно падать на больших массивах с огромным количеством уникальных значений. 🤔

  • @fortilda1
    @fortilda1 10 місяців тому +1

    2 задача ``` const newArr = [...new Set(fruits)] ```

  • @demimurych1
    @demimurych1 Рік тому +3

    Задачи на собеседованиях используются для того, чтобы проверить навык соискателя на работу с той или иной технологией или знанию какой-либо части языка
    То есть задачи на собеседованиях не даются для того, что бы их "лиш бы решили, кто решил тот молодец"
    Если принять этот тезис за правду то тогда обозначенные задачи могли бы решаться следующим образом:
    _По одной задаче в дочернем комментарии_

    • @demimurych1
      @demimurych1 Рік тому

      *Задача 1: Сколько раз каждый элемент встречается в массиве:*
      Эта задача на предмет того, насколько соискатель владеет выражениями в JS
      (
      (theTargetList) => (
      theTargetList.reduce(
      (theRes, theCur) => (
      (++theRes[theCur] || (theRes[theCur]=1), theRes)
      )
      , {}
      )
      )
      )
      (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);

    • @demimurych1
      @demimurych1 Рік тому

      *Задача 2: Создать массив который содержит только уникальные значения*
      Это задача на знание того чем являются структуры map или set
      (
      (theTargetList) => (
      [...new Set(theTargetList)]
      )
      )
      (['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple']);

    • @demimurych1
      @demimurych1 Рік тому

      *Задача 3: Создать функцию, которая сгруппирует студентов по возрасту*
      Это задача подобно первой проверяет понимание выражений, с упором в Object
      (
      (theStudentList) => (
      theStudentList.reduce(
      (theRes, theCur) => (
      (theRes[theCur.age] ||= []).push(theCur)
      ,theRes
      )
      ,{}
      )
      )
      )
      ( [
      { name: 'alex', age: 20 },
      { name: 'mike', age: 24 },
      { name: 'masha', age: 20 },
      { name: 'stas', age: 18 },
      ]);

    • @demimurych1
      @demimurych1 Рік тому +1

      *Задача 4: Написать функцию, которая принимает два аргумент*
      массив из уникальных целых чисел и сумму в виде целого числа. Если сумма двух любых чисел массива из аргумента равна числу, которое приходит вторым аргументом, функция должна вернуть новый массив из этих двух чисел в любом порядке.
      Если решения нет, вернуть пустой массив.
      Это задача на то, насколько соискатель может мыслить не в лоб. Способен ли он импровизировать.
      Оригинальных решений у нее достаточно много. Обычно от соискателя ждут уточняющий вопрос, который помогает ему выбрать наиболее оптимальное.
      Например такое:
      (
      (theListOfNumbers, theTargetSum) => (
      theListOfNumbers.reduce(
      (theRes, theCur, theIndex, theArr) => {
      var theTarget;
      ( theArr.indexOf((theTarget=theTargetSum-theCur), ++theIndex) !== -1)
      && (theRes.push([theCur, theTarget]));
      return theRes;
      }
      , []
      )
      )
      )([3, 5, -4, 8, 11, 1, -1, 6,4], 10);

    • @demimurych1
      @demimurych1 Рік тому

      *Задача 5: Получить единый массив из любимых пицц каждого друга*
      Это задача на знание того что такое flat
      (
      (thePizzaList) => (
      thePizzaList.reduce(
      (theRes, theCur) => (theRes.push(theCur.pizzas),theRes)
      , []
      ).flat()
      )
      )([
      { name: 'alex', pizzas: ['cheese', 'pepperoni'] },
      { name: 'mike', pizzas: ['salami', 'margarita'] },
      { name: 'stas', pizzas: ['meat'] },
      { name: 'anna', pizzas: ['fish'] }
      ]);

  • @hrayrashchyan5925
    @hrayrashchyan5925 Рік тому +1

    на всякий если решение повторяться ,я не смотрел заранее
    const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple'];
    const countFruit = (list) => {
    let obj = {};
    list.map((v,i)=>{
    if(!obj[v]){
    obj[v] = 1
    }else{
    (obj[v])++
    }
    })
    console.log(obj)
    return obj
    }
    countFruit(fruits)
    если отличается от вашего кода, сделаете код ревью и оставляете отзывы

    • @hrayrashchyan5925
      @hrayrashchyan5925 Рік тому +1

      super, almost the same solution

    • @hrayrashchyan5925
      @hrayrashchyan5925 Рік тому +2

      task 2
      const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple'];
      const uniqueSet = new Set(fruits)
      const arr = Array.from(uniqueSet)
      console.log(arr)

    • @hrayrashchyan5925
      @hrayrashchyan5925 Рік тому

      task3
      const students = [
      {name: 'alex',age:20},
      {name: 'mike',age:24},
      {name: 'masha',age:20},
      {name: 'stas',age:18},
      ];
      function foo(list) {
      resObj = {};
      list.map((obj,index) => {
      if(!resObj[obj.age]){
      resObj[obj.age] = [obj]
      } else {
      resObj[obj.age].push(obj)
      }
      })
      console.log(resObj)
      }
      foo(students)

    • @hrayrashchyan5925
      @hrayrashchyan5925 Рік тому

      same solution again

    • @fakejoji1
      @fakejoji1 Рік тому +1

      @@hrayrashchyan5925 const fruits = ['kiwi', 'apple', 'kiwi', 'orange', 'kiwi', 'apple'];
      const uniqueFruits = [...new Set(fruits)];
      console.log(uniqueFruits)

  • @vvllaaddiikk
    @vvllaaddiikk Рік тому +1

    думаю reduce можно в одну строку делать

  • @СережаИгнатовский-ь3б
    @СережаИгнатовский-ь3б 8 місяців тому +4

    третья задача попалась на реальном собеседовании

  • @adamhanck
    @adamhanck 9 місяців тому +1

    Для первой задачки можно было ещё проще написать, как вариант)
    for (let el of fruits){
    if (objFruit[`${el}`]){
    objFruit[`${el}`] += 1;
    }
    else{
    objFruit[`${el}`] = 1;
    }
    }

    • @SerzhNesteruk
      @SerzhNesteruk 9 місяців тому +1

      Спасибо, что поделились решением!
      Есть некоторые нюансы.
      1) Пропущено важное объявление:
      const objFruit = Object.create(null);
      Инициализировать objFruit стоит именно так, а не через литерал пустого объекта, во избежание коллизий с именами унаследованных свойств от Object.prototype.
      2) Можно воспользоваться преимуществом динамической типизации и вместо objFruit[`${el}`] просто писать эквивалентное objFruit[el]
      3) Конструкцию if...else можно заменить одной строкой:
      objFruit[el] = (objFruit[el] || 0) + 1;
      Ну, а вообще. Здесь как-то уж очень напрашивается reduce:
      const objFruit = fruits.reduce((map, item) => {
      map[item] = map([item] || 0) + 1;
      return map;
      }, Object.create(null) );

  • @oppositus
    @oppositus 11 місяців тому

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

  • @BrainF1986
    @BrainF1986 2 місяці тому

    Открыл видео. Увидел решение первой задачи. Закрыл видео.

  • @ДмитрийЧёрный-ж9г

    4я задача, если поставить больше цифр, или цифры которые в сумме тоже дадут "10", 5 5, 3 7, 4 6 ..... данная функция вернет только Первую пару.

    • @azatfarmanyan150
      @azatfarmanyan150 Рік тому +1

      const arr = [-1, 3, 5, 4, -4, 8, 11, 1, -1, 6];
      const sum = 10;
      function getSum(arr, sum) {
      const res = [];
      for (let i = 0; i < arr.length; i++) {
      const eli = arr[i];
      for (let j = i + 1; j < arr.length; j++) {
      const elj = arr[j];
      if (eli + elj === sum) {
      res.push([eli, elj]);
      }
      }
      }
      return res;
      }
      console.log(getSum(arr, sum));

    • @SerzhNesteruk
      @SerzhNesteruk 10 місяців тому

      Так, вроде, именно в этом и заключается условие задачи, а вовсе не в возврате многоуровнего массива со всеми подходящими парами слагаемых. Поэтому в оптимальном решении должно быть предусмотрено: досрочный выход из цикла при нахождение первой пары; сохранение пройденных значений чисел в библиотеку для снижения максимальной сложности алгоритма по времени с квадратичной до линейной. В коде это можно реализовать примерно так:
      const findFirstPairOfTerms = (arr, sum) => {
      const lib = new Set();
      for (const num of arr) {
      const diff = sum - num;
      if (lib.has(diff)) {
      return [diff, num];
      }
      lib.add(num);
      }
      return [];
      };

  • @oppositus
    @oppositus 11 місяців тому

    5-я задача. Как вы все любите reduce не по делу! Решается через Set. Заодно и быстрее будет

    • @SerzhNesteruk
      @SerzhNesteruk 10 місяців тому

      Принцип YAGNI применим не только в коммерческой разработке, но и в спортивном (олимпиадном) программировании. Если постановкой задачи от нас требуется вернуть плоский массив из любимых пицц друзей, то результатом функции должен быть именно массив, а не коллекция Set. Если требование об уникализации списка пицц перед нами не ставилось, то и реализовывать его не следует.
      Меня больше смущает forEach (с нечистыми callback-функциями) в тех случаях, когда напрашивается reduce. При этом последний достаточно универсален, поэтому его применение часто является вполне заслуженным. Хотя в этом случае лучше действительно применить не его, а метод flatMap:
      const extractFavoritePizzas = friends => (
      friends.flatMap(item => item.pizzas ?? [])
      );

  • @iq240-1
    @iq240-1 Рік тому +1

    👍

  • @ediltalantbekov
    @ediltalantbekov Рік тому +3

    4 решение ну такое себе (Вложенный цикл). В зависимости от размера массива, это решение станет очень долгим и затратным.
    есть лучше решение с object опять же)
    const findPairs = (nums, sum) => {
    const lib = {};
    for (let i = 0; i < nums.length; i++) {
    const diff = sum - nums[i];
    if (lib[diff]) return [diff, nums[i]];
    lib[nums[i]] = i;
    }
    return [];
    }

    • @GonzaVladimir
      @GonzaVladimir Рік тому

      сумма например 8, или -4.

    • @GonzaVladimir
      @GonzaVladimir Рік тому

      @@MrBeasD... что причём тут это? это что тут причём не понял вопроса. Я ошибку то вижу у него в коде. и сразу увидел на каких числах будет баг. вот и написал автору, пусть попробует сумму 8 сделать . Ты странный дядя. формулируй мысли свои лучше

    • @GonzaVladimir
      @GonzaVladimir Рік тому

      @@MrBeasD... я тебе скажу, что я только что кое что поправил и он работает. но ты должен сам понять

    • @SerzhNesteruk
      @SerzhNesteruk 10 місяців тому +2

      Для массива [6, 4] и значения суммы 10 будет возвращён пустой массив. Во всех случаях, когда одно из слагаемых находится на нулевом индексе, функция будет работать некорректно, поэтому lib[nums[i]] = i; лучше заменить на lib[nums[i]] = true;
      🤔 Ну, и как по мне, вместо объекта лучше использовать коллекцию Set (const lib = new Set();), тогда 2-я и 3-я строки в теле цикла будут иметь следующий вид:
      if ( lib.has(diff) ) return [diff, nums[i]];
      lib.add(nums[i]);

  • @alenache1
    @alenache1 Рік тому +1

    в 4 задаче в java вылетела бы IndexOutOfBoundsException, элемент по j выходит за диапазон

  • @oppositus
    @oppositus 11 місяців тому +1

    2-я задача тоже решена грязно и не оптимально. Решается в 1 строчку:
    return Array.from(new Set(list))

  • @GazGaz-xq4fd
    @GazGaz-xq4fd 7 місяців тому

    в 4 задаче автор привёл решение, которое работает за O(n^2), что очень плохо, такое решение на собесе не прокатит, следует приводить более быстрое решение

  • @benchik100
    @benchik100 8 місяців тому +1

    i've done

  • @rukioruk6949
    @rukioruk6949 Рік тому

    Получилось решить 4-ю задачу таким образом:
    const findPairs = (numbers: number[], sum: number): number[] => {
    let result: number[] = []
    numbers.forEach((itemI: number, i: number) => {
    numbers.forEach((itemJ: number, j: number) => {
    if (i !== j && itemI + itemJ === sum) {
    result = [itemI, itemJ];
    }
    })
    })
    return result;
    }

    • @SerzhNesteruk
      @SerzhNesteruk 10 місяців тому +1

      Спасибо за то, что делитесь! Решение выполнено методом brute force с полным перебором всех возможных вариантов. В данном решении нет досрочного завершения цикла при нахождении первой подходящей пары слагаемых. Та и сложность алгоритма по времени здесь равна O(n²). В варианте на видео она в 2 раза меньше (было учтено то, что порядок сложения не влияет на сумму [a + b эквивалентно b + a], путём задания стартового значения счётчика во внутреннем цикле), хотя и там она квадратичная. Но всё же есть возможность решить задачу с линейной сложностью O(n) и с досрочным завершением цикла. В JS-коде это будет выглядеть примерно так:
      const findFirstPairOfTerms = (arr, sum) => {
      const lib = new Set();
      for (const num of arr) {
      const diff = sum - num;
      if (lib.has(diff)) {
      return [diff, num];
      }
      lib.add(num);
      }
      return [];
      };

    • @rukioruk6949
      @rukioruk6949 10 місяців тому +1

      @@SerzhNesteruk Согласен, что по сложности не проходит и можно с одной итерацией. :)

  • @oppositus
    @oppositus 11 місяців тому

    6-я задача ок. Можно сделать быстрее через 2 индекса, но ладно, зачот.

  • @motherhackerok
    @motherhackerok Рік тому +1

    Везде пихает forEach -_- , самый нерекомендуемый способ

  • @xdayx53
    @xdayx53 8 місяців тому +2

    умники в комментах собрались)))))))))))))

  • @Ирилл-щ9р
    @Ирилл-щ9р 6 місяців тому

    вторую задачу можно было написать в 2 строки

  • @oppositus
    @oppositus 11 місяців тому +1

    Комментарии по ходу просмотра:
    1-я задача решена грязно. Нужно использовать Map. Официальные гайды и best practices однозначно рекомендуют использовать Map вместо object. К тому же на 11-й строке нужно использовать !count.hasOwnProperty(f) или "!(f in count)". Не зачет.

    • @SerzhNesteruk
      @SerzhNesteruk 10 місяців тому

      Согласен с тем, что коллекция Map была бы здесь более удачным выбором. Но в постановке задачи нам таки требуется вернуть object, поэтому даже решая через map нам потом следует результат преобразовать, вернув Object.fromEntries(count). Поэтому решать сразу через объект тоже вполне возможно.
      Да, !count.hasOwnProperty(f) было бы точнее, полностью поддерживаю. А вот для применения оператора in (или даже сравнения count[f] == null) объект следовало бы создавать без прототипа через Object.create(null), чтобы унаследованные свойства не влияли на корректность работы функции.

  • @webdeveloper5770
    @webdeveloper5770 5 місяців тому +1

    Вот работа из чего наша состоит? Взять данные с сервера и отрисовать их в шаблоне. Или взять данные от пользовать и отправить на сервер. А на собеседованиях реально эта чушь.