★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝()➤GitHub地址:➤原文地址: ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★There is a special square room with mirrors on each of the four walls. Except for the southwest corner, there are receptors on each of the remaining corners, numbered 0
, 1
, and 2
.
The square room has walls of length p
, and a laser ray from the southwest corner first meets the east wall at a distance q
from the 0
th receptor.
Return the number of the receptor that the ray meets first. (It is guaranteed that the ray will meet a receptor eventually.)
Example 1:
Input: p = 2, q = 1Output: 2Explanation: The ray meets receptor 2 the first time it gets reflected back to the left wall.
Note:
1 <= p <= 1000
0 <= q <= p
有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0
, 1
,以及 2
。
正方形房间的墙壁长度为 p
,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0
的距离为 q
。
返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。
示例:
输入: p = 2, q = 1输出: 2解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。
提示:
1 <= p <= 1000
0 <= q <= p
Runtime: 4 ms
Memory Usage: 18.5 MB
1 class Solution { 2 func mirrorReflection(_ p: Int, _ q: Int) -> Int { 3 var p = p 4 var q = q 5 while (p % 2 == 0 && q % 2 == 0) 6 { 7 p /= 2 8 q /= 2 9 }10 if p % 2 == 011 {12 return 213 }14 else if q % 2 == 015 {16 return 017 }18 else19 {20 return 121 }22 }23 }
4ms
1 final class Solution { 2 func mirrorReflection(_ p: Int, _ q: Int) -> Int { 3 var curQ = 0 4 var count = 0 5 var opposite = false 6 while curQ != p { 7 curQ &+= q 8 count &+= 1 9 if curQ > p {10 curQ &-= p11 opposite = !opposite12 }13 }14 if opposite { return 0 }15 return count % 2 == 1 ? 1 : 216 }17 }
8ms
1 class Solution { 2 func mirrorReflection(_ p: Int, _ q: Int) -> Int { 3 var n=1 4 while Double(n*q)/Double(p)-Double(n*q/p) != 0 { 5 n+=1 6 } 7 if Double(n*q/p)/Double(2) - Double(n*q/(2*p))==0 { 8 return Double(n)/Double(2) - Double(n/2)==0 ? -1:0 9 }else{10 return Double(n)/Double(2) - Double(n/2)==0 ? 2:111 }12 }13 }