Czy istnieje zasada, że po 20 minutach powinieneś zacząć kodować bez względu na wszystko?
Nie, ale jeśli poświęcisz 20 minut na analizę problemu, zanim zabierzesz się do pracy, prawdopodobnie już masz kłopoty. Pracodawca, który zadaje ci pytanie takie jak to, które zacytowałeś, jest najbardziej zainteresowany sposobem, w jaki podchodzisz do problemu, ale jeśli poprosi go o problem z kodowaniem, również będzie chciał zobaczyć kod. Omów je przez proces myślowy ...
Cóż, oczywistym podejściem tutaj jest brutalna siła. Gdybym miał sposób rozpoznać prawy trójkąt, biorąc pod uwagę trzy wierzchołki, mógłbym przejść przez wszystkie kombinacje dwóch punktów i początku szukając odpowiednich trójkątów. To nie powinno być trudne - mogę napisać funkcję, która używa twierdzenia Pitagorasa do identyfikowania właściwych trójkątów. Aby to ułatwić, napiszę również funkcję określającą odległość między dwoma punktami za pomocą wzoru odległości ...
Pisanie tych funkcji powinno zająć około trzech minut. Teraz, zaledwie kilka minut od pytania, pokazałeś już, że pamiętasz podstawową geometrię i że naprawdę umiesz pisać kod. Daje ci również coś do rozmowy:
Tak więc moglibyśmy oczywiście umieścić isRightTriangle(p1, p2, p3)
funkcję w środku czterech for
pętli i iterować wszystkie możliwe opcje dla każdego z dwóch zmiennych punktów. Zobaczmy ... problem dotyczy liczby prostokątów w tym początku na siatce 50 x 50, więc użycie metody brutalnej siły pozwala sprawdzić 50 możliwości dla każdej współrzędnej każdego punktu. To 50 ^ 4 czeków ... Jestem pewien, że możemy zrobić lepiej, ale kod jest oczywisty, więc pozwól mi to zapisać ...
Więc teraz piszesz funkcję, która używa zagnieżdżonych for
pętli i isRightTriangle()
funkcję, którą właśnie napisałeś. Rozwiązałeś problem, ale pozwoliłeś ankieterowi zobaczyć, dokąd zmierzasz. Jeśli ich celem było po prostu sprawdzenie, czy umiesz pisać kod, mogą powiedzieć ci, żebyś przestał. Bardziej prawdopodobne jest, że z przyjemnością rozmawiają z kimś, kto wie, co robią, i będą chcieli zobaczyć, jak daleko się posuniesz. Więc kontynuuj ...
Kiedy pisałem, przyszło mi do głowy, że możemy skorzystać z symetrii. Możemy odzwierciedlić dowolny odpowiedni trójkąt wokół linii 45 °, więc jeśli zdecydujemy się sprawdzić jeden z punktów tylko po jednej stronie tej linii, możemy po prostu policzyć dowolne znalezione trójkąty dwa razy ... raz dla trójkąta i raz za swoje odbicie. To zmniejsza liczbę kontroli o połowę. Teraz, patrząc na to, bierzemy pierwiastek kwadratowy, aby znaleźć odległość między dwoma punktami, ale potem po prostu to kwadrat w isRightTriangle()
...
I tak dalej. Ponownie, zazwyczaj nie chcą znaleźć idealnego rozwiązania, chcą zobaczyć, w jaki sposób można uzyskać rozwiązanie. Twój proces myślowy nie musi być podobny do powyższego - po prostu pewność, że będziesz głośno myśleć, będzie się bardzo liczył. Nie przejmuj się, jeśli popełnisz błąd - po prostu powiedz „hmmm, chyba zszedłem z torów - pozwól mi cofnąć się o krok ...”