1. 程式人生 > >leetcode 858

leetcode 858

此題是技巧題,挺有意思的。題目主要是說鏡子反射的問題,這題花費的比較長的時間。建議可以先手動畫一畫找找規律,我們可以很容易推導得到從側面經過上下底面返回到第一個側面的時候,距離最近點的初始距離是q- p %q,這個可以通過斜率不變以及相似三角形的性質推導得到。知道這一點之後,我們需要考慮的只有方向的問題,我們可以設定兩個bool變數,來表示在上下,和在左右,我們可以很容易知道每次碰到上下面的時候,上下方向肯定會改變,對於左右的情況,我們需要看看p/q的值,分成奇數和偶數考慮,一種是方向不變,一種是方向改變。雖然這題最後自己做出來了,但是覺得挺有趣的,mark一下,附程式碼:

class Solution:     def mirrorReflection(self, p, q):         """         :type p: int         :type q: int         :rtype: int         """         res = 0         if q ==0:             return 0         right = False         up = True         while not ((p-res)%q == 0):             count = int((p-res)/q)             if count % 2 == 0:                 right = not right             res = q - (p-res)%q             up = not up         if ((p-res)/q) % 2 == 1:             right = not right         if right and up:             return 1         elif not right and up:             return 2         else:             return 0