HackerRank: циклическое вращение массива в Python
Итак, я на HackerRank, и ОСТОРОЖНО, СПОЙЛЕРЫ
Это заняло у меня около пяти минут.
На самом деле это не о том, как я решил проблему, хотя я кратко расскажу об этом.
Я спросил себя/google «сдвиг массива python вправо» и напомнил, что collections
а также deque
существует. Я использовал их раньше. В Python так много классных инструментов, о которых я постоянно забываю. Вы не можете наказать кого-то за то, что он не помнит каждую вещь.
def circularArrayRotation(a, k, queries):
from collections import deque
items = deque(a)
items.rotate(k)
ret_list = []
for q in queries:
#print(items[q])
ret_list.append(items[q])
return ret_list
Интересно, что вы заметите, что я закомментировал оператор печати в цикле.
Когда я впервые написал функцию, она выглядела так:
def circularArrayRotation(a, k, queries):
from collections import deque
items = deque(a)
items.rotate(k)
ret_list = []
for q in queries:
print(items[q])
Это именно то, к чему призывало описание проблемы.
«Для каждого запроса выведите значение элемента по индексу повернутого массива в новой строке».
Я думал, что сделал это, но затем компилятор/тестер HackerRank выдал ошибку:
Compiler Message
Runtime Error
Error (stderr)
Traceback (most recent call last):
File "Solution.py", line 42, in <module>
fptr.write('\n'.join(map(str, result)))
TypeError: 'NoneType' object is not iterable
Input (stdin)
3 2 3
1 2 3
0
1
2
Итак, я говорю «Хммм…» и проверяю главное:
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
nkq = input().split()
n = int(nkq[0])
k = int(nkq[1])
q = int(nkq[2])
a = list(map(int, input().rstrip().split()))
queries = []
for _ in range(q):
queries_item = int(input())
queries.append(queries_item)
result = circularArrayRotation(a, k, queries)
fptr.write('\n'.join(map(str, result)))
fptr.write('\n')
fptr.close()
Важная часть заключается в следующем:
result = circularArrayRotation(a, k, queries)
Кажется, они хотели возвращаться ценность! Ага! Я тогда понял, что я сделал неправильно!
Смотрите, отладка проста
Итак, я закомментировал оператор печати и составил список элементов для возврата с заданными параметрами, и БАМ! 100% по тестам.
Пару дней назад мой рейтинг на HackerRank поднялся с 900 000 до 600 000. Только что я поднялся до 544328.
Честно говоря, вся эта дискуссия поднимает тему, о которой я буду гневаться/записывать в блог в ближайшем будущем, если кто-то не сделает этого до меня, но она в основном касается философских различий стилей разработки старой школы и новой школы.
Давным-давно у нас не было сверхбыстрого интернета, чтобы искать вещи, и разработчикам нужно было действительно знать все сверхэффективно или иметь возможность ссылаться на вещи в физических книгах.
Если есть что-то, чему я научился в государственной школе, так это то, как пользоваться указателем книг и находить ответы на вопросы или решения проблем.
Это отличается, скажем, от разработки полезности deque
а также rotate
самостоятельно. Но HackerRank не просил меня разрабатывать его с нуля. Они просто просят вас решить проблему.
Является ли это обманом, чтобы иметь возможность искать вещи? Вы действительно программист, если полагаетесь на готовые инструменты?
Я думаю: если у вас есть возможность создавать инструменты самостоятельно, вы получаете зеленый свет на использование готовых инструментов. Часто проблема для меня заключается в том, «какие инструменты использовать?», но до сих пор это был Python.
И, ну, технически, Google тоже.