Написание качественного кода всегда должно быть приоритетом, даже для начинающего разработчика вроде меня. Лично я обнаружил, что проще всего сначала проработать и найти решение, а затем вернуться назад и провести рефакторинг этого решения, чтобы улучшить его качество. Я покажу вам, как я это сделал с одной конкретной проблемой HackerRank.

Проблема заключается в следующем:

Моей первой мыслью было взять первое значение, а затем пройтись по массиву, сравнивая это значение с каждым в массиве. Если бы это значение совпало, я бы каждый раз увеличивал счетчик. В конце цикла я бы полностью удалил это значение из массива, разделил бы счетчик на два (мы ищем пары), а затем начал бы процесс заново со следующим значением, пока не останется пустой массив. Мое первое решение в итоге выглядело так:

Все тесты проходят с этим решением, но оптимально ли оно? Ну, во-первых, мы видим, что с этим решением массив приходится перебирать несколько раз. Цикл «array.forEach()» будет вызываться каждый раз, когда мы начинаем с нового значения (currentSock). Этот цикл (объявленный в функции removeSocks) вложен в другой цикл while, который выполняется до тех пор, пока существует заполненный массив. Это также увеличивает сложность и общее время, необходимое для выполнения функции sockMerchant().

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

В отличие от моего первоначального решения, было бы намного лучше, если бы мы могли взять первое значение, сравнить его со списком и, если оно присутствует, увеличить счетчик, затем удалить это значение из этого списка и так далее. Это позволило бы нам пройтись по массиву только один раз, повысив эффективность и уменьшив сложность. Для этого мы можем создать экземпляр пустого массива, который мы будем использовать в качестве нашего списка. Сделав это, мы можем сравнить наше значение с этим списком и, если оно присутствует, увеличить наш счетчик и удалить его из списка. С другой стороны, если значение отсутствует, мы добавим его в наш список. Решение выглядит примерно так:

Я узнал, что рефакторинг является неотъемлемой частью набора инструментов разработчика. Качество должно быть в центре внимания при написании любого фрагмента кода. Если вы еще этого не сделали, потратьте некоторое время после того, как найдете решение, чтобы посмотреть, сможете ли вы улучшить его, даже если оно исправит опечатку.