Некоторые из вас могут не знать обо мне следующее: Я ОБОЖАЮ КОДИРОВАТЬ ВЫЗОВЫ, и я уже давно «играю» с ними…
Это помогло мне с легкостью пройти несколько собеседований по программированию для некоторых действительно интересных собеседований (если вам интересно, я мог бы рассказать вам больше об этом в другом посте, просто дайте мне знать;)).
В прошлом я даже писал несколько сообщений в блоге на Medium о том, как я решил некоторые задачи кодирования с помощью JavaScript (который является моим языком GO-TO для этого типа задач).
Есть несколько сайтов, которые я использовал, чтобы улучшить свои навыки, некоторые из них: CodeSignal, HackerRank, FreeCodeCamp, а недавно я нашел CodeWars.
Хорошо ... хватит болтовни, давайте перейдем к кодированию!
На сегодняшний день я выбрал очень простую задачу по программированию, просто чтобы разогреться. Вы можете найти его на FreeCodeCamp. Он говорит:
Возвращает наименьший индекс, по которому значение (второй аргумент) должно быть вставлено в массив (первый аргумент) после его сортировки. Возвращаемое значение должно быть числом.
Например,
getIndexToIns([1, 2, 3, 4], 1.5)
должен возвращать1
, потому что он больше1
(с индексом 0), но меньше2
(с индексом 1).
Аналогично,
getIndexToIns([20, 3, 5], 19)
должен возвращать2
, потому что после сортировки массива он будет выглядеть как[3, 5, 20]
, а19
меньше20
(индекс 2) и больше5
(индекс 1).
Примечание. Если вы еще не выполнили эту задачу, я НАСТОЯТЕЛЬНО рекомендую, а также было бы очень полезно сначала решить ее самостоятельно, а затем вы можете вернуться и увидеть мои решения.
Примечание 2. Вы могли видеть, что я написал решения, потому что у меня есть два дополнительных решения, которые более продвинуты. Это для тех из вас, кто более опытен и хочет немного оживить его. Вы можете перейти к этой части. : D
Первое решение - удобный для новичков способ
Первое, что вы должны сделать, когда хотите решить проблему кодирования, - это убедиться, что вы точно понимаете, что они от вас хотят. Поэтому полезно составить список небольших конкретных задач, которые легко решить (разделяй и властвуй):
- Создайте функцию, которая будет принимать два аргумента - массив чисел и число.
- Вставьте число в массив
- Отсортируйте массив
- Возвращает позицию (индекс), в которой находится число, в отсортированном массиве
Поскольку проблема довольно проста, я напишу весь код JavaScript и напишу шаги в комментариях:
function getIndexToIns(arr, num) {
arr.push(num);
const sortedArr = arr.sort(function(a, b) { return a - b; });
return sortedArr.indexOf(num);
}
Это почти все ...
Единственное, что я хочу отметить, это то, что я использовал пользовательский function
внутри функции sort
, потому что по умолчанию функция sort
не очень хорошо сортирует массив чисел ... Например, если у вас есть такой массив, как: [3, 1, 10, 2, 20, 4]
, после сортировка будет выглядеть так: [1, 10, 2, 20, 3, 4]
, что не то, что мы хотим. По этой причине мы использовали пользовательскую функцию выше - Проблема решена! : clap:: clap:
Второе решение - «навороченный» способ
После того, как я закончу задание по кодированию, я предпочитаю на мгновение остановиться и подумать, как найти лучший / умный способ решить его снова! Я делаю это для развлечения, но иногда открываю новые способы решения проблемы.
Для этой конкретной проблемы я заметил некоторые «улучшения», которые я мог бы сделать:
- Я могу использовать Оператор распространения, чтобы объединить массив и число в новый массив.
- Я мог использовать Уменьшить, чтобы сохранить искомый индекс в аккумулятор.
- Я мог бы напрямую вернуть результат, сохранив несколько нажатий клавиш: P
Окончательный результат выглядит так:
const getIndexToIns = (arr, num) => [...arr, num]
.sort((a, b) => a - b)
.reduce( (acc, current, i) =>
(current === num && acc === -1 ? i : acc),
-1
);
В первый раз моя функция reduce
выглядела так:
.reduce((acc, current, i) => (current === num ? i : acc), -1)
Но вскоре я понял, что если число встречается несколько раз в массиве, оно вернет последний индекс, а им нужен первый индекс, поэтому Я добавил && acc === -1
часть кода, которая удостоверяется, что если число было найдено, оно не должно «сохранять» другой индекс, поэтому возвращает это значение.
Третье решение - «быстрый» способ
После публикации этого сообщения некоторые из вас отметили, что мы можем пойти еще дальше и улучшить решение, сократив количество циклов обработки массива. Мы можем решить эту проблему с помощью только одной итерации! ^ _ ^
Обычно, пока мы перебираем массив, мы проверяем, не превышает ли число текущее значение из массива. Если это так, мы просто увеличиваем счетчик.
Я использовал метод reduce
, поскольку он довольно простой (и однострочный: P):
let getIndexToIns = (arr, num) =>
arr.reduce((acc, current) => (num > current ? ++acc : acc), 0);
Заключение
Что вы думаете о моем решении этой конкретной проблемы? Вы нашли другой подход? Дайте мне знать, я бы хотел это услышать!
В конце я хочу сказать это еще раз: Я ОБОЖАЮ КОДИРОВАТЬ ЗАДАЧИ! Причина в том, что когда вам удается решить задачу, это дает вам такое хорошее чувство ... Это заставляет вас чувствовать себя умным. (хотя бы на время - смеется :))).
Я помню, что я тратил часы на некоторые задачи по программированию, иногда я даже тратил несколько часов за ночь, просто чтобы найти решение, и… о боже, как я был счастлив, когда, наконец, сделал это. : D
Может быть, это только я, или, может быть, вы чувствуете то же самое ... тем не менее, дайте мне знать, если вам нравятся такие сообщения в блоге, и я буду счастлив писать больше в будущем. ;)
Первоначально опубликовано на www.florin-pop.com