Один из наиболее часто упоминаемых способов повышения квалификации начинающих программистов (или недавних выпускников учебных курсов) - использование онлайн-инструментов, таких как 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 - это первая попытка грубой силы, используя следующий код:
Мысли:
- Это определенно не приводит к желаемому результату, так как мой код нарезает только последний символ, тогда как это может быть многозначное число в конце строки
- Если числа в конце строки имеют переменный размер, в настоящее время невозможно определить, когда заканчивается алфавит и начинаются числовые символы.
- Это определенно требует регулярных выражений или сокращенно RegEx.
Шаг 3. Найдите элегантное решение.
Быстрый поиск привел меня к нескольким очень сложным решениям без использования RegEx, но дальнейшие исследования привели меня к более элегантному решению:
Шаг 4. Изучите решение построчно и сделайте аннотации.
импорт повторно
- Импорт пакета для использования всех возможностей регулярных выражений
def increment_string (s):
- Создание экземпляра новой функции, цель которой описана ранее.
число = re.findall (r ’\ d +’, s)
- findall - findall () находит * все * совпадения и возвращает их в виде списка строк, каждая из которых представляет одно совпадение. Чтобы углубиться в детали, мы можем перейти к документации по регулярным выражениям с сайта docs.python.org: Строка просматривается слева направо, и совпадения возвращаются в найденном порядке. Если в шаблоне присутствует одна или несколько групп, верните список групп; это будет список кортежей, если в шаблоне больше одной группы. В результат включаются пустые совпадения .
- r ‘’ - это означает, что ввод Python должен быть сырой строкой, как объяснено в этом сообщении блога от 2011 года.
- \ d - десятичная цифра [0–9] (некоторые старые утилиты регулярных выражений не поддерживают, кроме \ d, но все они поддерживают \ w и \ s). В сочетании со знаком плюс, +, он включает 1 или несколько экземпляров шаблона слева от него.
если число:
- Логическая логика для проверки существования number (истинно)
s_number = число [-1]
- Объединение строк, берет последний символ из строки number и сохраняет его как новый фрагмент памяти
s = s.rsplit (s_number, 1) [0]
- Разбивает ранее сохраненные значения в соответствии со следующими правилами: str.rsplit ([separator [, maxsplit]]), что означает, что он разделяет s_number с пределом 1, а затем берет первый символ и сохраняет его как новый фрагмент памяти
число = 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.