Как стать автором
Обновить

Комментарии 34

НЛО прилетело и опубликовало эту надпись здесь
const funique = (arr) => [...new Set(arr)];
На собеседовании была такая задача, про Set сразу не подумал, решил проходом по массиву — сказали что правильно, но через Set лучше и элегантнее.

Через неделю другое собеседование, задача та же, делаю через Set — сказали что правильно, но они хотят посмотреть на знание перебирающих методов массива и попросили сделать по другому)

Со сплющиванием массива есть тоже забавный хак:


const flat = (arr) => arr.join().split(',')

flat([1, [2, [3, [4,5]]]]); // => [1, 2, 3, 4, 5]

только в итоге не числа, а строки в массиве

В условии задачи не было сказано, что этот массив состоит из чисел. Если toString() элемента массива вернёт запятую — забавный хак превратится в забавный баг.
НЛО прилетело и опубликовало эту надпись здесь
Еще на алгоритмы некоторые ребята дают… Тоже за то, чтобы узнавать у собеседующихся об их опыте путем проектирования решения для конкретных рабочих задач. Механика воплощения этих проектов будет зависеть от фреймворка и архитектуры, от подходов, использующихся в проекте, и, как правило, с вдохновением из StackOverflow, а не кодингом «с нуля». Но от юниоров, закончивших какие-нибудь курсы, хотелось бы ожидать как раз умения работать с чистым языком и логикой, так как опыта в решении реальных задач у них, как правило, нет, так что подобные задачки подойдут.
Какой процент из подобных задач встречался вам на работе?

Если только сортировка по уникальности. Ну как бы, когда приходишь на собес, тебя не спрашивают: «Хочешь такую задачу порешать, а может тебе не понравилась эта, можем на выбор предложить эту и эту».Увы, так не бывает. Ты или делаешь ту, что дают, или «мы вам перезвоним».
Если бы я проводила собеседование, стала бы я давать такие задачи, точно нет.

А эта вся ерунда на собеседованиях гуглится за 2 минуты если будет надо, смысл вот давать эти задачи?

Может они прекрасно гугляться, но на собесе же не достанешь мобильный и не начнешь искать решение задачи в интернете? В противном случае результат: «мы вам перезвоним».
Я бы не бухтел при выдаче подобных задач, только если бы очень хотел попасть именно в эту контору и условия были бы отличными. Но если меня собеседует совсем «зеленый» человек и говорит что надо использовать двойное равенство вместо тройного, потому что так короче, и дает задачу написать сортировку «пузырьком», то чешу репу и говорю «я вам перезвоню»)) Не шучу, бывало и такое, причем на собеседовании на сеньорские позиции.
Задача: Написать функцию, принимающую аргументом массив чисел и возвращающую новый массив, состоящий из удвоенных значений первого.


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

function f(arr = []) {
  const result = [];

  arr.reduce((acc, item) => {
    if (typeof item === 'number') {
      acc.push(item * 2);
    }

    return acc;
  }, result);

  return result;
}

f([1, 2, null, 7, 8, null, 3]); // => [2, 4, 14, 16, 6]


Так же добавлю, что в массиве могут быть string/undefined/boolean типы, в общем любой тип, отличный от null. Поэтому лучше не проверять условие как привел автор (i !== null).
Ну так, все равно один прогон по массиву у вас остался, но в то же время увеличилось время для восприятия кода.
Внимательно посмотрите на пример автора и посчитайте сколько прогонов по массиву у него.
В статье два прогона, один фильтром, один map`м. В комменте используется reduce, который тоже проходит по всему массиву, переданному в качестве аргумента функции, и последовательно перебирает элементы этого массива. В итоге выигрыш в один прогон.

Метод «arr.reduce(callback[, initialValue])» используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата.

Это один из самых сложных методов для работы с массивами.

learn.javascript.ru — Массив: перебирающие методы

В таком случае нужно дополнительно сделать проверку на NaN
typeof NaN === 'number' // true

Реализовывать полифилл для Promise, используя const и стрелочные функции…
Где он заработает, интересно?

Больше похоже на фантазию автора, нежели реальный кейс, где нужно сидеть и педалить реализацию промисов.

На собеседование в МТС попросили реализовать promise(я с ходу не смогла написать),
в Wildberries — Promise.all и еще три задачи из перечисленных(здесь решила все четыре),
задача из Mail:
var obj = {};
function func(x) {
	x = 1;
...

в СТС — «сжатие строк»,
Комсомольская правда — обход дерева.

Как бы большинство не шарашкины конторы с предлагаемой зп выше 150К и всякими ништяками, бонусами. Выбирала по зп, относительно близком ко мне территориальном расположении и что бы компания была более, менее известной.
Это я еще в Яндекс не ходила, вот они славятся своими задачами на алгоритмы.
А кто сейчас в здравом уме будет использовать самописный промис? Да и необходимость использовать сейчас проверенный полифил не особо-то актуальна, это только если требуется поддержка ie11 или Opera Mini. Остальные приличные браузеры уже давно поддерживают. Да и к тому же, если можешь написать промис, то какие проблемы подправить код с const на var, а стрелочные функции на обычные, где надо прибиндив контекст.

Но на мой взгляд, не очень подходящий вопрос для собеса.
Но в любом случае задача «написать полифилл» и задача «изложить алгоритм Promise, не используя Promise» — это разные задачи.

никто не пишет свои промисы костылей ради. но вы удивитесь, что во многих часто используемых библиотеках (решил проверить около полугода или года назад) промисы реализовывают через setTimeout(), что в корне не верно.


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


https://html.spec.whatwg.org/multipage/webappapis.html#event-loops


The microtask queue is not a task queue.
По поводу третьей с конца задачи, зачем так писать код?

За такое на первом же ревью а-та-та.

Но на фоне остальных вопросов — этот вполне норм, там скорее смотрят как человек будет рассуждать.
Какие-то задачи в вакууме, которые на фронте чуть более чем никогда не применяются. Вообще не понятно, что с их помощью выясняется о кандидате: справится или нет?
Хорошими задачами являются те, которые максимально приближены к специфике работы, на которую человек устраивается. Ведь решать придется именно задачи проекта, а не вот этот треш, который в целом пишется один раз, помещается во вспомогательную библиотеку и забывается.
Некоторые теоретические вопросы также бессмысленны, например, такой как вопрос про регистрацию событий, при условии, что человек нанимается на уже действующий проект, в котором тот или иной подход укрепился.
НЛО прилетело и опубликовало эту надпись здесь
На какой уровень разработчика дают такие задачи? Junior? Middle?
Я расцениваю себя как middle, но вот провести четкую границу между джун, мидл, сеньор очень сложно.
Спасибо большое за ответ!

Тут уже обращали внимание на реализацию Промиса, но почему-то никто не обратил внимания, что она неверна:


  1. Промис не возвращает значение (resolve() и reject() не принимают аргументы)
  2. then() и catch() вместо нового промиса возвращают тот же самый.
  3. Следствие пункта 2 — не важно, в каком порядке в цепочке расположены then() и catch() — выполнятся только один вид коллбеков.
  4. Ещё одно следствие 2 — возврат из любого коллбека промиса также руботать не будет.
  5. Все then()/catch() коллбеки вызываются одновременно — не очень понятно, зачем вообще тогда больше одного then()
  6. Ну и throw в любом из коллбеков просто выкинет ошибку и прервет выполнение всей цепочки.
    В результате это даже близко не похоже на промис — я бы назвал это одноразовым EventEmitter'ом.
Ещё не хватает вызова колбеков then()/catch() в микротасках, концепции thenable, и прочая и прочая…
Моё имхо — промисный полифил слишком громоздкий, чтобы быть задачей для собеседования.
Настолько приблизительного «полифила» для промиса я ещё не видел :)

Рекурсивный обход дерева не выдает требуемый порядок, потому что «поиск в глубину». Нерекурсивный — норм., там «поиск в ширину».

Ну и RLE можно в одну строку
const rle = s => s.replace(/(.)\1+/g, (m, c) => c + m.length);
Задача: Сортировка нечётных.

Здравствуйте. А почему так сложно? Можно же попроще:
function oddSort(arr) {
//отобрать только нечетные и отсортировать
    odd_sorted = arr.filter((x)=> x%2==1 ).sort((a,b)=>a-b);
//вставить их на нечетные места
    return arr.map(item => {
        return (item%2 != 0)? odd_sorted.shift() : item;
    });   
}
У вас получилось так же тяжелое решение. Метод .shift() занимает O(N), т.е. удаляет первый элемент и все остальные сдвигает на -1 позицию. И того, если у вас M нечетных чисел, в итерации arr.map(...) (K — всего чисел), сложность будет O(M*K), что, при тесте, где все числа нечетные, выйдет O(K^2) (так как M === K). В некоторые компании, такие решения не принимаются(
Чтоб это исправить, достаточно создать указатель элементы в odd_sorted:
function oddSort(arr) {
//отобрать только нечетные и отсортировать
    odd_sorted = arr.filter((x)=> x%2==1 ).sort((a,b)=>a-b);
//вставить их на нечетные места
   let i = 0; // увеличиваем его каждый раз, после вставки нечетных в массив
    return arr.map(item => {
        return (item%2 != 0)? odd_sorted[i++] : item;
    });   
}

что даст сложность O(2K + MlogM) (уже не квадрат)
Да, спасибо! Ваш вариант эффективнее.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории