Это стандартная задача присутствует в любом базовом курсе по программированию, имеется ввиду поэлементное копирование в другой массив или в этот же через переменную. С доступом к элементам через имямассива[индекс]. Делается через перебор и копирование элементов, и что удивительно, работает быстрее чем .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);
во-первых a.length это вычисляемое значение, и если уж писать максимально оптимальный код, то нужно вынести его в отдельную переменную. Во-вторых, нельзя тестировать скорость выполняя 1000000 раз одно и то же. У сред исполнения будь то браузер или нода есть несколько уровней оптимизации исполнения по капотом и через каждое некоторое количество прогонов будет все больше и больше операций не выполнятся, а браться из кэша. Для замера времени исполнения есть console.time '
Вы , Александр , грамотный и позитивный программист !!! , , удачи и ни пуха ,!!! , , я из Запорожья , 55 лет , , тока знакомлюсь с html css js php ,,,, но сын уже два года успешно фрилансит
Наверное тут под "посторонними библиотеками" имеются ввиду готовые функции (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; }
Спасибо вам за ваши видео, вот еще вариант в копилку: function reverse(a){ var res = [ ]; while(0 in a){ res.push( a.pop() ) }; return res }; reverse( [1, 2, 3] ) // -> [ 3, 2, 1 ]
Александр, приветствую! Если уж совсем без стандартных методов реализовывать то это полнейшая казуистика. Из задачи не понятно, как именно нужно поменять порядок элементов в массиве. В своем решении я решил четные значения с нечетными значениями поменять местами. Код при этом уже в ад превратился. :)))) 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 Александр, пользуясь случаем хочу сказать большое спасибо за объяснение сложных вещей простыми словами. Задачка понравилась своей неопределенностью. :)
Думаю человек имел ввиду, что надо написать метод, которьій в точности повторяет оригинальньій. Супер все, но reverse мутируеющий метод, а у вас возврат нового массива. И да, другие методьі тоже нельзя использовать. Только нашел вьіход перебором половиньі массива.
Может посмотреть на варианты реализации данной задачи, чтобы определить уровень подготовки? Например, умение применять алгоритмы на javascript, применение встроенных методов в js.
В спецификациях JS, (конкретное место - поищите сами) четко сказано что индексы хранятся в символьном виде. А целочисленных значений и в помине нет. Поэтому цепочка a[b[c[d[i]]]] или что то подобное не может быть ефективно реализована.
Здравствуйте! Очень полезное видео! Можно пожалуйста больше таких задач :) Я написала свое решение "ручками" 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) Можно еще было создавать новый массив, изменять не оригинал
Когда-то давно у меня на собеседовании по Perl спрашивали примерно такой же вопрос, только звучал он ещё проще. Есть массив из 5 элементов. Выведи их... Я ж дурень начал писать цикл, в цикле вывод i-го элемента... А оказалось проще, что они хотели от меня увидеть - print @massiv все. (оператор @ просто выводит массив который ты ему указываешь)... Такими задачами проверяют насколько ты заморачиваться при выполнении простых вещей...
Можете рассказать как решить следующую задачу: есть двумерный массив, он заполнятся только с 1й стороны от главной диагонали, и нужно дозаполнить его до симметричной матрицы, я пытался сделать это с помощью for и переставляя номера элементов массива но у меня не вышло
@@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
Спасибо, классное видео! А если массив многомерный? Там же не написано, что массив может содержать только числа/строки, вдруг в него вложены другие массивы или объекты? Ещё сложнее, когда нужно не массив, а строку перевернуть, потому что в строке некоторые символы (например, смайлы) состоят из последовательности других символов.
вот хороший вопрос, я написал задание "как есть". Т.е. что дали то и написал - а дальше думай как хочешь. Меня тоже это смущает в задачах на собеседовании.
Хотели чтоб человек попарно противоположные элементы переставлял местами , если их число четное и выкрутился со средним элементом, который переставлять не нужно, если число элементов нечетное.
Может конечно они еще имели ввиду, например написать один цикл и смотреть один элемент сначала, а другой с конца и менять их местами, и так двигаться к середине. Но формулировка действительно странная.
А там реверс просто надо.. Ну может кому пригодится такой велосипед)) 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; }
Решил обе задачи до того как посмотрел видео. Задачу про массив решил так: 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. Правда оптимизацией здесь и не пахнет. =)
@@krolikrodjer8879 есть такое задание: реверс массива без использование встроенных функций тип [].reverse и без создания дополнительных массивов(объектов итд)
@@evgenkaban6018 а в чем прикол? Писать цикл с двумя счетчиками, один с начала, другой с конца, оба до середины, и менять местами через "temp"? Глупость какая-то, искусственное ограничение встроенных возможностей не поможет ни в чем, они ж встроены, а значит всегда "под рукой"
просто встречал подобные задачи, думаю просто проверяют логику мышления и знание как все работает изнутри однажды просили написать свою функцию reduce, которая работает с помощью рекурсии, без цыклов
Вот что от вас хотели получить от этой задачи: 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, а саму логику.
Вот еще способ, без готовых методов 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]
JS - убожище по определению на атомном уровне. У него нет целых значений в принципе. У него нет нормальных массивов в принципе, когда целое значение задает смещение в последовательности ячеек памяти (реализовывалось всегда одной командой процессора). В JS массив - это словарь, ключи которого хранятся в символьном виде. Пусть бы вся эта радость была на здоровье, но были целые значения, и простой (и быстрый) доступ по целочисленному индексу, как в Lua c с таблицами, там кстати все может совмещаться в одной таблице, и быстрый доступ по целочисленным значениям индексов, и доступ по ключам для словаря. Просто JS посадили на потоки WEB в браузеры с их DOM. Если б не монополия JS в браузерах, то из за одного вышеперечисленного JS давно бы уже был на свалке.
@@itgid А нельзя поинформативнее? Например сообщить что в переспективе и целочисленные значения и простой массив будут (когда? линк). Заявить что названные фишки нафиг не нужны наверное никто не может - прямая ж заявка в дурку. На худой конец, если в JS ну никак не возможно реализовать, так мож Lua подтянуть в браузеры, чтобы с DOM мог работать, я б и за второе согласен хвалу JS петь за демократичность, но писал бы скрипты на Lua. :)
@@itgid А что ж тут непонятного? Названые фишки необходимы для быстродействия. Проводятся конференции, обсуждаются проблемы - надо поднимать вопрос! А можно восторгаться неограничеными возможностями создания тормозящих накруток, как многие. Пока что JS напоминает корупционера сидящего на фин.потоках. Будут запросы сообщества разработчиков на изменения - будут и изменения. Может в JS, может преемник какой появится. Привел в пример Lua потому что на нем реализованы базовые потребности по эфективной обработке даных. Надеюсь на понимание.
Это стандартная задача присутствует в любом базовом курсе по программированию, имеется ввиду поэлементное копирование в другой массив или в этот же через переменную. С доступом к элементам через имямассива[индекс]. Делается через перебор и копирование элементов, и что удивительно, работает быстрее чем .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);
во-первых a.length это вычисляемое значение, и если уж писать максимально оптимальный код, то нужно вынести его в отдельную переменную. Во-вторых, нельзя тестировать скорость выполняя 1000000 раз одно и то же. У сред исполнения будь то браузер или нода есть несколько уровней оптимизации исполнения по капотом и через каждое некоторое количество прогонов будет все больше и больше операций не выполнятся, а браться из кэша. Для замера времени исполнения есть console.time
'
Вы , Александр , грамотный и позитивный программист !!! , , удачи и ни пуха ,!!! , , я из Запорожья , 55 лет , , тока знакомлюсь с html css js php ,,,, но сын уже два года успешно фрилансит
Привет вам из того же Запорожья)
Сподіваюсь, з вами усе в порядку. Переказую вітання з Харкова. Слава Україні!
Наверное тут под "посторонними библиотеками" имеются ввиду готовые функции (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;
}
Спасибо большое за Ваш труд, идея с задачами на собеседованиях просто супер. Я думаю поможете огромному количеству людей устроиться на работу!
Спасибо вам за ваши видео, вот еще вариант в копилку:
function reverse(a){
var res = [ ];
while(0 in a){ res.push( a.pop() ) };
return res
};
reverse( [1, 2, 3] ) // -> [ 3, 2, 1 ]
Только лайк! Без критики. Спасибо!
Куда Вам можно отправлять примеры решений задач, которые ещё не решены на сайте ? Возможно будет полезный материал для разбора ошибок.
отличный проектик с задачками запилил. красава!
Вот это ход конем ! Александр спасибо !
всмысле?
Александр, приветствую!
Если уж совсем без стандартных методов реализовывать то это полнейшая казуистика.
Из задачи не понятно, как именно нужно поменять порядок элементов в массиве. В своем решении я решил четные значения с нечетными значениями поменять местами.
Код при этом уже в ад превратился. :))))
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 Александр, пользуясь случаем хочу сказать большое спасибо за объяснение сложных вещей простыми словами. Задачка понравилась своей неопределенностью. :)
Думаю человек имел ввиду, что надо написать метод, которьій в точности повторяет оригинальньій.
Супер все, но reverse мутируеющий метод, а у вас возврат нового массива. И да, другие методьі тоже нельзя использовать. Только нашел вьіход перебором половиньі массива.
Спасибо Вам Большое за материал Алекс!
Как правило добавляется еще фраза - не использовать встроенную функцию (метод). Тогда уже сразу понятно, что нужно делать.
Задавали что то похожее, но объяснили что необходимо написать polyfill для reverse на es5
Может посмотреть на варианты реализации данной задачи, чтобы определить уровень подготовки? Например, умение применять алгоритмы на javascript, применение встроенных методов в js.
Может и так. Т.е. стандартный reverse знать достаточно, а остальные?
согласен, но редко где встречал в задачах несколько вариантов решения.
так тоже можно.
var arr = [1,2,3,4,5,6,7,8,9];
var result = [];
while(arr.length) {
result.push(arr.pop());
}
console.log(result);
В спецификациях JS, (конкретное место - поищите сами) четко сказано что индексы хранятся в символьном виде. А целочисленных значений и в помине нет. Поэтому цепочка a[b[c[d[i]]]] или что то подобное не может быть ефективно реализована.
Проект Эйлера надо вам порешать) как раз куча контента на канал будет)
ой там математика занудная. Для c++ неплохо, но для js занудно.
Просто чудово я якраз шукав метод для реверсу)
Я ваще полныл ноль, наачинаю в 30 лет ,18 марта 31год будет, так вот начию с нуляю с нуля html css и тут ваш js ,,просто нативнотложится) спасибо
Как успехи?
Может надо было развернуть любой массив, в том числе с учетом вложенных массивов?
Недавно столкнулся с подобной, скорее всего имелось ввиду - не пользуясь встроенными методами перевернуть изначальный массив.
Здравствуйте! Очень полезное видео! Можно пожалуйста больше таких задач :)
Я написала свое решение "ручками"
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)
Можно еще было создавать новый массив, изменять не оригинал
Когда-то давно у меня на собеседовании по Perl спрашивали примерно такой же вопрос, только звучал он ещё проще. Есть массив из 5 элементов. Выведи их... Я ж дурень начал писать цикл, в цикле вывод i-го элемента... А оказалось проще, что они хотели от меня увидеть - print @massiv все. (оператор @ просто выводит массив который ты ему указываешь)... Такими задачами проверяют насколько ты заморачиваться при выполнении простых вещей...
до просмотра решил обе через редьюс. как бы такое оценили на интервью?
Можете рассказать как решить следующую задачу: есть двумерный массив, он заполнятся только с 1й стороны от главной диагонали, и нужно дозаполнить его до симметричной матрицы, я пытался сделать это с помощью for и переставляя номера элементов массива но у меня не вышло
скиньте пример заполнения
@@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
Как тестовое давали сделать todo list , но у вас вроде есть мини видео по нему
на реакте или на нативе?
@@itgid они сказали можете сделать как вам удобней,
Спасибо, классное видео! А если массив многомерный? Там же не написано, что массив может содержать только числа/строки, вдруг в него вложены другие массивы или объекты? Ещё сложнее, когда нужно не массив, а строку перевернуть, потому что в строке некоторые символы (например, смайлы) состоят из последовательности других символов.
вот хороший вопрос, я написал задание "как есть". Т.е. что дали то и написал - а дальше думай как хочешь. Меня тоже это смущает в задачах на собеседовании.
Скорее к вопросу про реверс, чтобы понять, подойдет принцип "бритвы Окама".если позицию джуна то тогда понятно почему такие вопросы.
можна видео урок по JS реальный проект выполнить чтобый понятнее было?!
а может написать свою реализацию реверса, без создания нового массива. Такая задача была в книге "Выразительный JS"
именно, в этом и была задача скорее всего)
Я думаю решения с reverse достаточно.
вот меня тоже припекает, зачем эту задачу давать? достаточно ли этого?
Мне кажется в этой задаче хотят понять каким ты путём пойдёшь)
@@vadymstebakov3500 наверное да, в принципе сама по себе задача ничего не даст, но их 20 - поэтому в целом формируется понимание что и как ты пишешь.
Хотели чтоб человек попарно противоположные элементы переставлял местами , если их число четное и выкрутился со средним элементом, который переставлять не нужно, если число элементов нечетное.
да но нет :) не знаю. Вы если бы были на стороне дающей это задание что хотели бы посмотреть?
я бы решил так:
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;
}
Куда если что скидывать задачи? У меня есть несколько как раз на эту тему.
t.me/jsrules это телеграмм канал, либо прям сюда - я сразу опубликую и дам ссылку на вас. В течении недели будет возможность публиковать задачи.
Может конечно они еще имели ввиду, например написать один цикл и смотреть один элемент сначала, а другой с конца и менять их местами, и так двигаться к середине. Но формулировка действительно странная.
Начало 1:55
А там реверс просто надо.. Ну может кому пригодится такой велосипед))
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;
}
Решил обе задачи до того как посмотрел видео. Задачу про массив решил так:
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. Правда оптимизацией здесь и не пахнет. =)
Возможно задание специально неконкретное, чтобы посмотреть, будут ли уточняющие вопросы
r2, r3 не совсем верно. Задача перевернуть текущий массив, а не создать новый...
Ты дурачок или как?)
@@krolikrodjer8879 есть такое задание: реверс массива без использование встроенных функций тип [].reverse и без создания дополнительных массивов(объектов итд)
@@evgenkaban6018 а в чем прикол? Писать цикл с двумя счетчиками, один с начала, другой с конца, оба до середины, и менять местами через "temp"? Глупость какая-то, искусственное ограничение встроенных возможностей не поможет ни в чем, они ж встроены, а значит всегда "под рукой"
просто встречал подобные задачи, думаю просто проверяют логику мышления и знание как все работает изнутри
однажды просили написать свою функцию reduce, которая работает с помощью рекурсии, без цыклов
Вот что от вас хотели получить от этой задачи:
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, а саму логику.
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;
}
@@profesor1454 Ваш вариант работает медленнее чем исходный, хотя и быстрее чем .reverse()
Зачем писать лет в объявлении функции?
Наверное нужно развернуть массив не создавая новый, тогда ваши решения не подходят, кроме очевидного первого
не делите пожалуйста екран , код не видно, браузер выедает глаза, или сделайте что бы все было светлое, либо все темное, нереально ж смотреть
Вот еще способ, без готовых методов
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]
Наверное хотели проверить человека способен ли хоть что то сделать на js))
Написать функцию, которая принимает массив целых чисел и увеличивает каждое четное вдвое
const arr = (...arr) => {
for(i=0;i
+
Добро пожаловать в клуб любителей мелких шрифтов. Пока что минус. Не смог нормально посмотреть на 27 2к мониторе с расстояния 1,8м
JS - убожище по определению на атомном уровне. У него нет целых значений в принципе. У него нет нормальных массивов в принципе, когда целое значение задает смещение в последовательности ячеек памяти (реализовывалось всегда одной командой процессора). В JS массив - это словарь, ключи которого хранятся в символьном виде. Пусть бы вся эта радость была на здоровье, но были целые значения, и простой (и быстрый) доступ по целочисленному индексу, как в Lua c с таблицами, там кстати все может совмещаться в одной таблице, и быстрый доступ по целочисленным значениям индексов, и доступ по ключам для словаря. Просто JS посадили на потоки WEB в браузеры с их DOM. Если б не монополия JS в браузерах, то из за одного вышеперечисленного JS давно бы уже был на свалке.
И?
@@itgid А нельзя поинформативнее? Например сообщить что в переспективе и целочисленные значения и простой массив будут (когда? линк). Заявить что названные фишки нафиг не нужны наверное никто не может - прямая ж заявка в дурку. На худой конец, если в JS ну никак не возможно реализовать, так мож Lua подтянуть в браузеры, чтобы с DOM мог работать, я б и за второе согласен хвалу JS петь за демократичность, но писал бы скрипты на Lua. :)
@@ЮрійОлесь-с6о я затрудняюсь это этот поток сознания отвечать.
@@itgid А что ж тут непонятного? Названые фишки необходимы для быстродействия. Проводятся конференции, обсуждаются проблемы - надо поднимать вопрос! А можно восторгаться неограничеными возможностями создания тормозящих накруток, как многие. Пока что JS напоминает корупционера сидящего на фин.потоках. Будут запросы сообщества разработчиков на изменения - будут и изменения. Может в JS, может преемник какой появится. Привел в пример Lua потому что на нем реализованы базовые потребности по эфективной обработке даных. Надеюсь на понимание.
@@ЮрійОлесь-с6о ну ассемблер вообще вообще все быстро, почему его не используют?
Та это такое... Показали б лучше простой способ как перемешать элементы массива.