1. 题目:

有一个四面墙都有镜子的特殊正方形房间。除了西南角之外,其他三个角都有接收器,编号为0, 1, 2。方形房间的墙长度为p,有一束射线从西南角照射到东面的墙上,到墙角0的距离为q。请找出射线遇到的第一个接收器的编号(可以保证射线最终会遇到一个接收器)。

例如:

输入:p = 2, q = 1

输出:2

解释:当射线第一次反射到左边墙上的时候,会遇到接收器2。

注意:

1. 1 <= p <= 1000

2. 0 <= q <= p

2. 解释:

这道题如果直接硬解会比较复杂,可以用多次空间想象降低复杂度。

第一步:将射线照射方向直线延长,按照横向和纵向展开方形房间,如下图:

将射线直线延长后,遇到第一个接收器时,可以得到边长x,y的三角形,该三角形是通过边长p,q的三角形延长得到的,所以x/p = y/q,因为x/p为整数,所以y/q也为整数,又因为y同时也是方形边长p的整数倍,所以设存在整数变量n,y=np,找出最小值n满足np是q的整数倍即可,即可得到公式:

n = 1;  while( p*n % q != 0) n += 1 ;

通过上面的公式可以得出满足q和p最小公倍数y的变量n,y=np, x=(np/q)* p, 记住n、x和y的值对后面的推导很关键。

第二步:只在横向方向展开方形房间,射线会发生反射,如下图:

将方形房间按照横向展开,射线只在横轴发生发射,接收器0在下方,接收器1和2在上方,当射线反射2次、4次、6次、8次等2的倍数次才能遇到在下方的接收器0,那么反射的次数乘以方形边长p即等于第一步纵向展开的y,又因为第一步已经推导出了y=np,所以n即为反射的次数,当n为偶数时,射线会遇到接收器0,可得到公式:

if( n % 2 ==0 ) return 0;

第三步:还是只在横向方向展开方向房间,如下图:

当射线遇到接收器1时,横向距离x为X1,观察图可知X1是方形边长p的奇数倍,当射线遇到接收器2时,横向距离x为X2,观察图可知X2为方形边长p的偶数倍,第一步中已得到x=(np/q)* p,那么x的方形边长p的倍数为:(np/q)* p / p = np/q,可得到公式:

int r = p*n /q; if(r % 2 ==0) return 2; if(r % 2 ==1) return 1;

3. 总结:

该题考察的是对空间想象的能力,通过上面三步对方形房间的空间展开,很大程度降低了解题难度,综合每步得到的公式,汇总可以得到该题的正确答案:

public int mirrorReflection(int p, int q) {int n = 1;while( p*n % q != 0) n += 1 ;if( n % 2 ==0 ) return 0;int r =  p*n /q;if(r % 2 ==0) return 2;if(r % 2 ==1) return 1;return -1;
}

LeetCode算法题-镜面反射(Mirror Reflection)相关推荐

  1. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  2. LeetCode算法题-Reverse Linked List(Java实现)

    这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...

  3. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)

    这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...

  4. leetcode算法题--零钱兑换

    原题链接:https://leetcode-cn.com/problems/coin-change/ 相关题目:leetcode算法题–完全平方数★ 动态规划 dp[i] i从0到amount,dp[ ...

  5. leetcode算法题-- 买卖股票的最佳时机

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 这类股票题目请见leetcode算法题–最佳买卖股票时机含 ...

  6. leetcode算法题--买卖股票的最佳时机 II

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 这类股票题目请见leetcode算法题–最佳买卖股票 ...

  7. leetcode算法题--买卖股票的最佳时机含手续费

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/ 这类股票题目请见 ...

  8. leetcode算法题--完全平方数★

    原题链接:https://leetcode-cn.com/problems/perfect-squares/ 相关题目:leetcode算法题–零钱兑换 1.回溯法 就是暴力法,套路就是递归,但是有很 ...

  9. leetcode算法题--不同的二叉搜索树

    原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/ 相关题目:leetcode算法题--不同的二叉搜索树 II 1.递归 ...

最新文章

  1. 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较
  2. Foundations of Qt Development 学习笔记 Part1 Tips1-50
  3. php 表单搜索,wordpress的搜索表单searchform.php
  4. linux制作openssl rpm,CentOS 7 定制 OpenSSL RPM 包
  5. infoseccrypto_java下载_關於php接ICBC的支付接口的解決方案
  6. 从零开始入门 K8s | K8s 安全之访问控制
  7. php json 压缩传输,php json数据使用gzip压缩输出
  8. GitRepo 命令大全 ***
  9. 关于Apache2.4版本的phpMyAdmin的配置
  10. 别忽视分布式系统这六大“暗流”
  11. windows环境中JDK环境变量配置
  12. java lombok ppt,Lombok详解
  13. 台达plc自由口通讯_自由口通讯问题无法接收数据
  14. AMTEmu v0.9.2
  15. QT5修改windows电脑IP地址
  16. FastDFS 原理介绍
  17. tampermonkey这玩意如何替换flash播放器为h5播放器?
  18. Windows XP 按权限设置共享
  19. cmd检查java_如何通过cmd查看java环境
  20. Elasticsearch-2-附面试题

热门文章

  1. 【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
  2. 详解Po.et 技术栈
  3. 华为软开云7--部署
  4. Σoφoς:简单但有效的前向安全对称可搜索加密
  5. MySQL 5.6.21下载安装之安装篇(二)
  6. 软件测试qq是不是微信号,如何批量检测出QQ号是否开通微信?
  7. Glyphs for Mac 2.6.5 — 字体设计工具
  8. 微信自定义链接分享制作,微信自定义链接配置
  9. python外文文献翻译_英文学术文献翻译软件有哪些推荐?
  10. macbook新建html文件,New File Creation: 给 Mac 加上“新建文件菜单”