Один из наиболее часто упоминаемых способов повышения квалификации начинающих программистов (или недавних выпускников учебных курсов) - использование онлайн-инструментов, таких как www.hackerrank.com и www.codewars.com.

Я обычно слышал такие вещи, как: «Если вы можете решать все задачи Python на уровне сложности 6 кю на CodeWars, вы сможете пройти любые вопросы на собеседовании». Это привело к бесчисленным разочаровывающим и, возможно, непродуктивным дням попыток грубой силы внедрить решения в мой инструментарий, не задумываясь о том, что это может быть не лучший способ.

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

«Как я могу узнать, на каких проблемах нужно сосредоточиться?»

«Что, если бы я мог лучше провести это время, а не просто расстраиваться?»

«Как я могу сделать это лучше?»

Все это были вопросы, которые постоянно возникали у меня в голове на протяжении всей попытки, что делало ее даже более сложной, чем создание элегантного фрагмента кода для кажущейся сложной проблемы.

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

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

Помня об этом совете, я разработал новый подход к своему путешествию по кодированию:

Шаг 1. Найдите вопрос, который выходит за рамки моих возможностей.

Хорошим примером может служить задача 5-кю из Codewars, поскольку я раньше делал 7 'и редко 6. Чем выше число, тем легче проблема.

Шаг 2: Попытка «грубой силы», но только от 30 минут до 1 часа. Затем просмотрите код и убедитесь в его недостатках.

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

Шаг 3. Найдите элегантное решение.

Когда я изначально искал ответ, было несколько решений, которые содержали 50–100 строк кода; намного дольше, чем я ожидал. Дальнейшие исследования показали мне гораздо более короткое (хотя и более продвинутое) решение, всего 9 строк кода!

Шаг 4: Изучите и поймите код с письменным объяснением для меня, строка за строкой.

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

Давайте начнем!

Шаг 1: Я выбрал следующую задачу из CodeWars: https://www.codewars.com/kata/string-incrementer/train/python.

«Ваша задача - написать функцию, которая увеличивает строку, чтобы создать новую строку.

  • Если строка уже оканчивается числом, число следует увеличить на 1.
  • Если строка не оканчивается цифрой. цифру 1 нужно добавить к новой строке.

Примеры:

foo - ›foo1

foobar23 - ›foobar24

foo0042 - ›foo0043

foo9 - ›foo10

foo099 - ›foo100

Внимание: если число имеет нули в начале, следует учитывать количество цифр ».

Шаг 2 - это первая попытка грубой силы, используя следующий код:

Мысли:

  1. Это определенно не приводит к желаемому результату, так как мой код нарезает только последний символ, тогда как это может быть многозначное число в конце строки
  2. Если числа в конце строки имеют переменный размер, в настоящее время невозможно определить, когда заканчивается алфавит и начинаются числовые символы.
  3. Это определенно требует регулярных выражений или сокращенно RegEx.

Шаг 3. Найдите элегантное решение.

Быстрый поиск привел меня к нескольким очень сложным решениям без использования RegEx, но дальнейшие исследования привели меня к более элегантному решению:

Шаг 4. Изучите решение построчно и сделайте аннотации.

импорт повторно

  • Импорт пакета для использования всех возможностей регулярных выражений

def increment_string (s):

  • Создание экземпляра новой функции, цель которой описана ранее.

число = re.findall (r ’\ d +’, s)

если число:

  • Логическая логика для проверки существования number (истинно)

s_number = число [-1]

  • Объединение строк, берет последний символ из строки number и сохраняет его как новый фрагмент памяти

s = s.rsplit (s_number, 1) [0]

число = str (int (s_number) + 1)

  • Принимает s_number как int, увеличивает значение на 1 и затем преобразует в строку, которая сохраняется как новый фрагмент памяти

return s + ‘0’ * (len (s_number) - len (число)) + число

  • При условии наличия числа (True)
  • функция вернет исходную строку s, объединенную с таким количеством нулей, как длина s_number минус длина number, а затем объединит число еще раз

return s + ‘1’

  • Если number == False, возвращается строка s, соединенная с 1.