Некоторые из вас могут не знать обо мне следующее: Я ОБОЖАЮ КОДИРОВАТЬ ВЫЗОВЫ, и я уже давно «играю» с ними…

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

В прошлом я даже писал несколько сообщений в блоге на 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

Первое решение - удобный для новичков способ

Первое, что вы должны сделать, когда хотите решить проблему кодирования, - это убедиться, что вы точно понимаете, что они от вас хотят. Поэтому полезно составить список небольших конкретных задач, которые легко решить (разделяй и властвуй):

  1. Создайте функцию, которая будет принимать два аргумента - массив чисел и число.
  2. Вставьте число в массив
  3. Отсортируйте массив
  4. Возвращает позицию (индекс), в которой находится число, в отсортированном массиве

Поскольку проблема довольно проста, я напишу весь код 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:

Второе решение - «навороченный» способ

После того, как я закончу задание по кодированию, я предпочитаю на мгновение остановиться и подумать, как найти лучший / умный способ решить его снова! Я делаю это для развлечения, но иногда открываю новые способы решения проблемы.

Для этой конкретной проблемы я заметил некоторые «улучшения», которые я мог бы сделать:

  1. Я могу использовать Оператор распространения, чтобы объединить массив и число в новый массив.
  2. Я мог использовать Уменьшить, чтобы сохранить искомый индекс в аккумулятор.
  3. Я мог бы напрямую вернуть результат, сохранив несколько нажатий клавиш: 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