Есть ли правило, что через 20 минут вы должны просто начать писать код, несмотря ни на что?
Нет, но если вы потратите 20 минут на анализ проблемы, прежде чем приступить к делу, вы, вероятно, уже в беде. Работодатель, который задает вам вопрос, подобный тому, который вы цитировали, в основном интересуется тем, как вы подходите к проблеме, но если они зададут ее как проблему кодирования, они тоже захотят увидеть некоторый код. Обсудите их через ваш мыслительный процесс ...
Ну, очевидный подход здесь - грубая сила. Если бы у меня был способ распознать прямоугольный треугольник по трем вершинам, я мог бы пробегать все комбинации двух точек и источника, ища прямоугольные треугольники. Это не должно быть сложно - я могу написать функцию, которая использует теорему Пифагора для определения прямоугольных треугольников. Чтобы сделать это проще, я также напишу функцию, которая определяет расстояние между двумя точками, используя формулу расстояния ...
Написание этих функций должно занять около трех минут. Теперь, всего через несколько минут, вы уже показали, что помните базовую геометрию и действительно знаете, как писать код. Это также дает вам кое-что для разговора:
Таким образом, мы могли бы явно поместить isRightTriangle(p1, p2, p3)
функцию в середину четырех for
циклов и выполнить итерацию по всем возможным вариантам для каждой из двух переменных точек. Давайте посмотрим ... проблема запрашивает количество прямоугольных треугольников, включая начало координат на сетке 50x50, поэтому использование метода грубой силы заставляет нас проверять 50 возможностей для каждой координаты каждой точки. Это 50 ^ 4 проверок ... Я уверен, что мы можем сделать лучше, но код очевиден, поэтому позвольте мне записать это ...
Итак, теперь вы пишете функцию, которая использует вложенные for
циклы и isRightTriangle()
функцию, которую вы только что написали. Вы решили проблему, но также дали интервьюеру понять, куда вы идете. Если их целью было просто увидеть, что вы можете написать код, они могут попросить вас остановиться. Скорее всего, они счастливы поговорить с кем-то, кто знает, что они делают, и они захотят увидеть, как далеко вы это сделаете. Итак, вы продолжаете ...
Мне пришло в голову, когда я писал, что мы можем воспользоваться симметрией. Мы можем отразить любой заданный прямоугольный треугольник вокруг линии 45 °, поэтому, если мы решим проверить одну из точек только на одной стороне этой линии, мы можем просто посчитать любые найденные прямоугольные треугольники дважды ... один раз для треугольника и один раз для его отражения. Это сокращает количество проверок вдвое. Также, глядя на это сейчас, мы берем квадратный корень, чтобы найти расстояние между двумя точками, но затем мы просто возводим это в квадрат снова isRightTriangle()
...
И так далее. Опять же, они обычно не хотят видеть идеальное решение, они хотят видеть, как вы получаете решение. Ваш мыслительный процесс не должен быть чем-то похожим на приведенный выше - просто уверенность в том, что вы мыслите вслух, будет много значить. Не переживайте, если сделаете ошибку - просто скажите «хммм, я думаю, что я сошел с рельсов здесь - позвольте мне вернуться на шаг ...»