Решаем задачи собеседования JavaScript. Реверс массива

แชร์
ฝัง
  • เผยแพร่เมื่อ 15 พ.ย. 2024

ความคิดเห็น • 89

  • @oscarwilde8949
    @oscarwilde8949 5 ปีที่แล้ว +19

    Это стандартная задача присутствует в любом базовом курсе по программированию, имеется ввиду поэлементное копирование в другой массив или в этот же через переменную. С доступом к элементам через имямассива[индекс]. Делается через перебор и копирование элементов, и что удивительно, работает быстрее чем .reverse().
    let a= [4,6,8,9,10,12,13];
    function ffr(a) //через реверс
    {
    return a.reverse();
    }
    function ff(a) // меняем попарно элементы первый с последним, второй с предпоследним... (если нечётное количество, то сам на себя, тут можно улучшить, но лень)
    {
    let n = a.length;
    for (let i = 0; i < a.length/2; i++) //делаем до половины длинны, иначе получим исходный массив
    {
    tbeg = a[i];
    a[i]=a[n-1];
    a[n-1]=tbeg;
    n--;
    }
    return a;
    }
    //проверки на скорость выполнения
    let time = Date.now();
    for (let z = 0; z < 10000000; z++)
    {
    ff(a);
    }
    document.writeln(Date.now()-time);
    time = Date.now();
    for (let z = 0; z < 10000000; z++)
    {
    ffr(a);
    }
    document.writeln(Date.now()-time);

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

      во-первых a.length это вычисляемое значение, и если уж писать максимально оптимальный код, то нужно вынести его в отдельную переменную. Во-вторых, нельзя тестировать скорость выполняя 1000000 раз одно и то же. У сред исполнения будь то браузер или нода есть несколько уровней оптимизации исполнения по капотом и через каждое некоторое количество прогонов будет все больше и больше операций не выполнятся, а браться из кэша. Для замера времени исполнения есть console.time
      '

  • @igormashinski1533
    @igormashinski1533 5 ปีที่แล้ว +13

    Вы , Александр , грамотный и позитивный программист !!! , , удачи и ни пуха ,!!! , , я из Запорожья , 55 лет , , тока знакомлюсь с html css js php ,,,, но сын уже два года успешно фрилансит

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

      Привет вам из того же Запорожья)

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

      Сподіваюсь, з вами усе в порядку. Переказую вітання з Харкова. Слава Україні!

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

    Наверное тут под "посторонними библиотеками" имеются ввиду готовые функции (reverse, unshift, push). По сути напишите свою собственную reverse(), типа проверяют ваше понимание, как устроен код изнутри. Например:
    let = arr[1,2,3,4];
    function revers(arr){
    let arr2 = [];
    for(let i = 0; i < arr.length; i++){
    arr2[i] = arr[arr.length - 1 - i];
    }
    return arr2;
    }

  • @АндрейСкарынкин
    @АндрейСкарынкин 5 ปีที่แล้ว +4

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

  • @raiden1860
    @raiden1860 5 ปีที่แล้ว +11

    Спасибо вам за ваши видео, вот еще вариант в копилку:
    function reverse(a){
    var res = [ ];
    while(0 in a){ res.push( a.pop() ) };
    return res
    };
    reverse( [1, 2, 3] ) // -> [ 3, 2, 1 ]

  • @Viktorres1
    @Viktorres1 3 ปีที่แล้ว

    Только лайк! Без критики. Спасибо!

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

    Куда Вам можно отправлять примеры решений задач, которые ещё не решены на сайте ? Возможно будет полезный материал для разбора ошибок.

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

    отличный проектик с задачками запилил. красава!

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

    Вот это ход конем ! Александр спасибо !

    • @itgid
      @itgid  5 ปีที่แล้ว

      всмысле?

  • @ВладимирЧумак-п7э
    @ВладимирЧумак-п7э ปีที่แล้ว

    Александр, приветствую!
    Если уж совсем без стандартных методов реализовывать то это полнейшая казуистика.
    Из задачи не понятно, как именно нужно поменять порядок элементов в массиве. В своем решении я решил четные значения с нечетными значениями поменять местами.
    Код при этом уже в ад превратился. :))))
    const books = [1, 2, 3, 4, 5, 6, 7, 8];
    let even = []
    let odds = [];
    let result = [];
    for(let i = 0; i < books.length; i++) {
    books[i] % 2 === 0 ? even.push(books[i]) : odds.push(books[i]);
    }
    for(let i = 0; i

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

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

    • @ВладимирЧумак-п7э
      @ВладимирЧумак-п7э ปีที่แล้ว

      @@itgid Александр, пользуясь случаем хочу сказать большое спасибо за объяснение сложных вещей простыми словами. Задачка понравилась своей неопределенностью. :)

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

    Думаю человек имел ввиду, что надо написать метод, которьій в точности повторяет оригинальньій.
    Супер все, но reverse мутируеющий метод, а у вас возврат нового массива. И да, другие методьі тоже нельзя использовать. Только нашел вьіход перебором половиньі массива.

  • @1988proxy
    @1988proxy 5 ปีที่แล้ว

    Спасибо Вам Большое за материал Алекс!

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

    Как правило добавляется еще фраза - не использовать встроенную функцию (метод). Тогда уже сразу понятно, что нужно делать.

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

    Задавали что то похожее, но объяснили что необходимо написать polyfill для reverse на es5

  • @bob-tpaktopuct9729
    @bob-tpaktopuct9729 5 ปีที่แล้ว +1

    Может посмотреть на варианты реализации данной задачи, чтобы определить уровень подготовки? Например, умение применять алгоритмы на javascript, применение встроенных методов в js.

    • @itgid
      @itgid  5 ปีที่แล้ว

      Может и так. Т.е. стандартный reverse знать достаточно, а остальные?

    • @itgid
      @itgid  5 ปีที่แล้ว

      согласен, но редко где встречал в задачах несколько вариантов решения.

  • @1369Samil
    @1369Samil 5 ปีที่แล้ว +1

    так тоже можно.
    var arr = [1,2,3,4,5,6,7,8,9];
    var result = [];
    while(arr.length) {
    result.push(arr.pop());
    }
    console.log(result);

    • @ЮрійОлесь-с6о
      @ЮрійОлесь-с6о 5 ปีที่แล้ว

      В спецификациях JS, (конкретное место - поищите сами) четко сказано что индексы хранятся в символьном виде. А целочисленных значений и в помине нет. Поэтому цепочка a[b[c[d[i]]]] или что то подобное не может быть ефективно реализована.

  • @данилкононов-э3в
    @данилкононов-э3в 5 ปีที่แล้ว +4

    Проект Эйлера надо вам порешать) как раз куча контента на канал будет)

    • @itgid
      @itgid  5 ปีที่แล้ว

      ой там математика занудная. Для c++ неплохо, но для js занудно.

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

    Просто чудово я якраз шукав метод для реверсу)

  • @АнтуанСтебошевский
    @АнтуанСтебошевский 4 ปีที่แล้ว +1

    Я ваще полныл ноль, наачинаю в 30 лет ,18 марта 31год будет, так вот начию с нуляю с нуля html css и тут ваш js ,,просто нативнотложится) спасибо

    • @v.v.p.3234
      @v.v.p.3234 4 ปีที่แล้ว

      Как успехи?

  • @Nuts_Cracker
    @Nuts_Cracker 3 ปีที่แล้ว

    Может надо было развернуть любой массив, в том числе с учетом вложенных массивов?

  • @BazovskiySP
    @BazovskiySP 4 ปีที่แล้ว

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

  • @ДашаКороткевич
    @ДашаКороткевич ปีที่แล้ว

    Здравствуйте! Очень полезное видео! Можно пожалуйста больше таких задач :)
    Я написала свое решение "ручками"
    let arr2=[1,4,2,6,7,9,1];
    for(let i=0;i(arr2.length)/2){
    break
    }
    else{
    let k;
    k=arr2[i]
    arr2[i]=arr2[arr2.length-1-i]
    arr2[arr2.length-1-i]=k
    }
    }
    console.log(arr2)
    Можно еще было создавать новый массив, изменять не оригинал

  • @SergMirny_yt
    @SergMirny_yt 5 ปีที่แล้ว

    Когда-то давно у меня на собеседовании по Perl спрашивали примерно такой же вопрос, только звучал он ещё проще. Есть массив из 5 элементов. Выведи их... Я ж дурень начал писать цикл, в цикле вывод i-го элемента... А оказалось проще, что они хотели от меня увидеть - print @massiv все. (оператор @ просто выводит массив который ты ему указываешь)... Такими задачами проверяют насколько ты заморачиваться при выполнении простых вещей...

  • @Tesudzi
    @Tesudzi 3 ปีที่แล้ว

    до просмотра решил обе через редьюс. как бы такое оценили на интервью?

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

    Можете рассказать как решить следующую задачу: есть двумерный массив, он заполнятся только с 1й стороны от главной диагонали, и нужно дозаполнить его до симметричной матрицы, я пытался сделать это с помощью for и переставляя номера элементов массива но у меня не вышло

    • @itgid
      @itgid  5 ปีที่แล้ว

      скиньте пример заполнения

    • @lycaveknife5707
      @lycaveknife5707 5 ปีที่แล้ว

      @@itgid главная диагональ это из верхнего левого в нижний правый угол ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

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

    Как тестовое давали сделать todo list , но у вас вроде есть мини видео по нему

    • @itgid
      @itgid  5 ปีที่แล้ว

      на реакте или на нативе?

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

      @@itgid они сказали можете сделать как вам удобней,

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

    Спасибо, классное видео! А если массив многомерный? Там же не написано, что массив может содержать только числа/строки, вдруг в него вложены другие массивы или объекты? Ещё сложнее, когда нужно не массив, а строку перевернуть, потому что в строке некоторые символы (например, смайлы) состоят из последовательности других символов.

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

      вот хороший вопрос, я написал задание "как есть". Т.е. что дали то и написал - а дальше думай как хочешь. Меня тоже это смущает в задачах на собеседовании.

  • @ВаноВано-л6р
    @ВаноВано-л6р 5 ปีที่แล้ว

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

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

    можна видео урок по JS реальный проект выполнить чтобый понятнее было?!

  • @alexmuller6652
    @alexmuller6652 5 ปีที่แล้ว

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

    • @thisreal
      @thisreal 5 ปีที่แล้ว

      именно, в этом и была задача скорее всего)

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

    Я думаю решения с reverse достаточно.

    • @itgid
      @itgid  5 ปีที่แล้ว

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

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

      Мне кажется в этой задаче хотят понять каким ты путём пойдёшь)

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

      @@vadymstebakov3500 наверное да, в принципе сама по себе задача ничего не даст, но их 20 - поэтому в целом формируется понимание что и как ты пишешь.

  • @ИльяГорин-щ6ф
    @ИльяГорин-щ6ф 5 ปีที่แล้ว +2

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

    • @itgid
      @itgid  5 ปีที่แล้ว

      да но нет :) не знаю. Вы если бы были на стороне дающей это задание что хотели бы посмотреть?

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

    я бы решил так:
    let temp = 0;
    for (i=0; i < a.length/2; i++){
    temp = a[a.length - i - 1];
    a[a.length - i - 1] = a[i];
    a[i] = temp;
    }

  • @iGotton
    @iGotton 5 ปีที่แล้ว

    Куда если что скидывать задачи? У меня есть несколько как раз на эту тему.

    • @itgid
      @itgid  5 ปีที่แล้ว

      t.me/jsrules это телеграмм канал, либо прям сюда - я сразу опубликую и дам ссылку на вас. В течении недели будет возможность публиковать задачи.

  • @denoctis9378
    @denoctis9378 5 ปีที่แล้ว

    Может конечно они еще имели ввиду, например написать один цикл и смотреть один элемент сначала, а другой с конца и менять их местами, и так двигаться к середине. Но формулировка действительно странная.

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

    Начало 1:55

  • @masaltascream7484
    @masaltascream7484 5 ปีที่แล้ว

    А там реверс просто надо.. Ну может кому пригодится такой велосипед))
    let a = [0,1,2,3,4,5,6,7,8,9];
    function mix (m) {
    let temp = [], num = Number(), mas = m;
    for(var i=0; i{return e!==num});
    }
    return temp;
    }

  • @alevsandro
    @alevsandro 4 ปีที่แล้ว

    Решил обе задачи до того как посмотрел видео. Задачу про массив решил так:
    function reverseArray (arr) {
    if (!Array.isArray(arr)) return console.log ("Это не массив");
    for (var i = 0; i < arr.length/2; i++ ){
    var a = arr[i]
    var b = arr[arr.length - i - 1]
    arr[i] = b
    arr[arr.length - i - 1] = a
    }
    return arr
    }
    P.S. Правда оптимизацией здесь и не пахнет. =)

  • @7241984ify
    @7241984ify 4 ปีที่แล้ว

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

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

    r2, r3 не совсем верно. Задача перевернуть текущий массив, а не создать новый...

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

      Ты дурачок или как?)

    • @evgenkaban6018
      @evgenkaban6018 5 ปีที่แล้ว

      @@krolikrodjer8879 есть такое задание: реверс массива без использование встроенных функций тип [].reverse и без создания дополнительных массивов(объектов итд)

    • @lekca216
      @lekca216 5 ปีที่แล้ว

      @@evgenkaban6018 а в чем прикол? Писать цикл с двумя счетчиками, один с начала, другой с конца, оба до середины, и менять местами через "temp"? Глупость какая-то, искусственное ограничение встроенных возможностей не поможет ни в чем, они ж встроены, а значит всегда "под рукой"

    • @evgenkaban6018
      @evgenkaban6018 5 ปีที่แล้ว

      просто встречал подобные задачи, думаю просто проверяют логику мышления и знание как все работает изнутри
      однажды просили написать свою функцию reduce, которая работает с помощью рекурсии, без цыклов

  • @thisreal
    @thisreal 5 ปีที่แล้ว +7

    Вот что от вас хотели получить от этой задачи:
    let customReverse = array => {
    let lastItemIndex = array.length - 1;
    for (let i = 0; i < array.length / 2; i++) {
    let tempItem = array[lastItemIndex - i];
    array[lastItemIndex - i] = array[i];
    array[i] = tempItem;
    }
    return array;
    }
    Скорее всего проверка не на знания js, а саму логику.

    • @profesor1454
      @profesor1454 5 ปีที่แล้ว

      let customReverse = array => {
      let lastItemIndex = array.length - 1;
      for (let i = 0; i < array.length / 2; i++) {
      [array[lastItemIndex - i], array[i]] = [array[i], array[lastItemIndex - i]]
      }
      return array;
      }

    • @oscarwilde8949
      @oscarwilde8949 5 ปีที่แล้ว

      @@profesor1454 Ваш вариант работает медленнее чем исходный, хотя и быстрее чем .reverse()

    • @Вбелом-й3з
      @Вбелом-й3з 4 ปีที่แล้ว

      Зачем писать лет в объявлении функции?

  • @Taurlom-Kampot
    @Taurlom-Kampot 3 ปีที่แล้ว

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

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

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

  • @yaroslav8609
    @yaroslav8609 3 ปีที่แล้ว

    Вот еще способ, без готовых методов
    let arr = [1,2,3,4,5,6]
    Array.prototype.myReverse = function (){
    let temp
    for(let i = 0; i < this.length - 1; i++) {
    if(i >= (this.length - 1)/2) return // если половину массива прошли, то дальше менять не надо
    temp = this[i]
    this[i] = this[this.length - 1 - i]
    this[this.length - 1 - i] = temp
    }
    }
    arr.myReverse()
    console.log(arr) // [6,5,4,3,2,1]

  • @sergiistryzg9699
    @sergiistryzg9699 5 ปีที่แล้ว

    Наверное хотели проверить человека способен ли хоть что то сделать на js))

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

    Написать функцию, которая принимает массив целых чисел и увеличивает каждое четное вдвое
    const arr = (...arr) => {
    for(i=0;i

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

    +

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

    Добро пожаловать в клуб любителей мелких шрифтов. Пока что минус. Не смог нормально посмотреть на 27 2к мониторе с расстояния 1,8м

  • @ЮрійОлесь-с6о
    @ЮрійОлесь-с6о 5 ปีที่แล้ว

    JS - убожище по определению на атомном уровне. У него нет целых значений в принципе. У него нет нормальных массивов в принципе, когда целое значение задает смещение в последовательности ячеек памяти (реализовывалось всегда одной командой процессора). В JS массив - это словарь, ключи которого хранятся в символьном виде. Пусть бы вся эта радость была на здоровье, но были целые значения, и простой (и быстрый) доступ по целочисленному индексу, как в Lua c с таблицами, там кстати все может совмещаться в одной таблице, и быстрый доступ по целочисленным значениям индексов, и доступ по ключам для словаря. Просто JS посадили на потоки WEB в браузеры с их DOM. Если б не монополия JS в браузерах, то из за одного вышеперечисленного JS давно бы уже был на свалке.

    • @itgid
      @itgid  5 ปีที่แล้ว

      И?

    • @ЮрійОлесь-с6о
      @ЮрійОлесь-с6о 5 ปีที่แล้ว

      @@itgid А нельзя поинформативнее? Например сообщить что в переспективе и целочисленные значения и простой массив будут (когда? линк). Заявить что названные фишки нафиг не нужны наверное никто не может - прямая ж заявка в дурку. На худой конец, если в JS ну никак не возможно реализовать, так мож Lua подтянуть в браузеры, чтобы с DOM мог работать, я б и за второе согласен хвалу JS петь за демократичность, но писал бы скрипты на Lua. :)

    • @itgid
      @itgid  5 ปีที่แล้ว

      @@ЮрійОлесь-с6о я затрудняюсь это этот поток сознания отвечать.

    • @ЮрійОлесь-с6о
      @ЮрійОлесь-с6о 5 ปีที่แล้ว

      @@itgid А что ж тут непонятного? Названые фишки необходимы для быстродействия. Проводятся конференции, обсуждаются проблемы - надо поднимать вопрос! А можно восторгаться неограничеными возможностями создания тормозящих накруток, как многие. Пока что JS напоминает корупционера сидящего на фин.потоках. Будут запросы сообщества разработчиков на изменения - будут и изменения. Может в JS, может преемник какой появится. Привел в пример Lua потому что на нем реализованы базовые потребности по эфективной обработке даных. Надеюсь на понимание.

    • @itgid
      @itgid  5 ปีที่แล้ว

      @@ЮрійОлесь-с6о ну ассемблер вообще вообще все быстро, почему его не используют?

  • @Tureckiy_xl
    @Tureckiy_xl 4 ปีที่แล้ว

    Та это такое... Показали б лучше простой способ как перемешать элементы массива.