漫画:王者新赛季 “镜” 给大家出的算法题!

今天是小浩算法“365刷题计划”第82天 - 休息日 工作日。这两天熟悉的朋友该知道我情绪不太好。但总不能借着由头,便拖期延稿诉衷肠。毕竟消除恐惧的最好方法就是面对恐惧。微笑着面对它,坚持才是胜利,加油!奥利给!

01

PART

镜面反射

王者荣耀新赛季出了个“镜”,那我也出个“镜”呗。那个不会玩,这个总该会“玩”吧?

第858题:有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0,1,以及 2。正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。

示例:

输入:p = 2, q = 1输出:2解释:这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。

上面的题目绕得很,大概就是这么个意思:

02

PART

题目分析

这是一道数学题...不喜勿喷

我们知道光是由西南角发出的,也就是左下角。发出之后可能会出现多种情况(注意,下图略过了部分光线反射的情况)。看起来是十分复杂,无迹可寻。

但是如果我们把光线的运动轨迹拆开来看,就可以观测到,光线每经过一次折反,都会在纵向距离上移动 q(首次与东墙相距的距离)。同时,一旦其向上行走的距离为 p 的整数倍,就一定会碰到某个接收点(注意:这里我们不需要考虑北面墙是否存在,根据光的反射定律可得可以参考一下下面这张图:

问题变得简单了,光线最终向上走的距离,其实就是 p 和 q 的最小公倍数。我们设最小公倍数为 L,会发现如果 L 是 p 的奇数倍,光线则到达北墙(可以参考上面的图)当 L 是 p 的 偶数倍,光线将会射到南墙

问题来了,如果光线是射向南墙,因为只有一个接收器了,必定只能遇到接收器 0。但是如果射到了北墙,如何区分是 1 和 2。这回到了一个初中数学题,我们可以通过光线与东西墙的接触次数,来判断最终的落点是 1 还是 2。

根据分析,得出代码(这道题应该不需要给多语言版本吧,都长一样....):

//JAVA
class Solution {
    public int mirrorReflection(int p, int q) {
        int m = p, n = q;
        int r;
        while (n > 0) {
            r = m % n;
            m = n;
            n = r;
        }
        if ((p / m) % 2 == 0) {
            return 2;
        } else if ((q / m) % 2 == 0) {
            return 0;
        } else {
            return 1;
        }
    }
}

郑重申明(读我的文章必看):

  • 本系列所有教程都不会用到复杂的语言特性,大家无须担心没有学过相关语法,算法思想才是最重要的!

  • 作为学术文章,虽然风格可以风趣,但严谨,我是认真的。本文所有代码均在leetcode进行过测试运行。

03

PART

结尾

这道题学会了吗?如果不会就不要玩镜了吧(皮一个)。

哈哈哈哈哈,今天发文有点晚,你们一定猜不到我嘎哈去了....

猜猜这是个哈子?

今天的题目到这里就结束了,如果想看其他面试题相关内容的,可以看:

漫画:知乎面试题(旋转数组最小值Ⅰ - 基础版)

漫画:知乎面试题(旋转数组最小值Ⅱ - 进阶版)

漫画:美团面试题(TOPK:求第K个最大的元素)

漫画:腾讯面试题(面试官问我会不会修供暖器,我说没问题)

漫画:位运算技巧整理汇总+一道被嫌弃的题目

如果你问我对学习算法有什么建议,这篇文章是必看的:

漫画:呕心泣血算法指导篇(真正的干货,怒怼那些说算法没用的人)

 小浩算法,每日

关注领取《图解算法》高清版

进群的小伙伴请加右侧私人微信(备注:进群)

-----抽奖分隔线----

???????????? 扫码回复“红包”参与抽奖

金额:100元 | 个数:20个 | 中奖率:20%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值