有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0
, 1
,以及 2
。
正方形房间的墙壁长度为 p
,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0
的距离为 q
。
返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。
示例:
输入: p = 2, q = 1 输出: 2 解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。
不得不说leetcode700,800之后的题越来越玄乎了。
这种数学题愣是没想出来。
感谢。
实际上这题是一个找规律的题。我们把光分为右上,右下,左上,左下四个方向。
因为“特殊规律代表一般规律”,设距离顶端(1,2出口这条线)为y。
用up,right两个bool值代表当前是否是右上,up取False是下,right取False是上。
每当y==0时才是进行判断的时候,观察可知(看图),1接受来自右上方向的,2接受左上方向的,其他应该是0接收。
当接触到顶端时,up会发生改变,而且每次碰撞right都会发生改变(可以用纸笔画画试试),要解决的是如果接触顶端导致y将变成负数如何解决。也是用笔试验一下,只要再加上p就能代表反弹。代码如下:
class Solution:
def mirrorReflection(self, p, q):
y=p
up=right=True
while True:
y-=q
if y==0:
if up:
if right:
return 1
else:
return 2
else:
return 0
if y<0:
y+=p
up=not up
right=not right