美文网首页Python程序员联盟计算机杂谈
100%的程序员都想挑战的算法趣题|文末送书

100%的程序员都想挑战的算法趣题|文末送书

作者: 菜鸟学python | 来源:发表于2017-08-12 18:11 被阅读754次

    算法是是程序的灵魂,一个程序员的水平的高度,关键看他的算法。世界上最顶级的公司比如Google,Facebook.微软面试第一环节就是算法,算法都是重中之重,学好算法很重要.

    计算机的世界每天都在发生着深刻的变化。新操作系统的发布、CPU性能的提升、智能手机和平板电脑的流行、存储介质的变化、云的普及……这样的变化数不胜数。

    在这样日新月异的时代中,“算法”是不变的重要基石。要编写高效率的程序,就需要优化算法。无论开发工具如何进化,熟识并能灵活运用算法仍然是对程序员的基本要求。

    本文为那些已经学习过排序、搜索等知名算法,并想要学习更多有趣的算法,进一步提升编程技巧的工程师准备了四道数学谜题形式的问题。这四道趣题分入门、初级、中级、高级,四种级别。

    100%的程序员都想挑战这四道有【等级区别】算法趣题。

    在挑战之前,先听小编介绍下问题的具体形式:

    每个问题大致分为“问题”和“详解”两部分。

    请各位先通读问题描述,并动手编写程序尝试解题。在这个过程中,具体的实现方法是其次,更重要的是思考“通过哪些步骤来实现才能够解决问题”。

    每个问题都有思路讲解和源代码示例。请留意自己编程时在处理速度、可读性等方面进行的优化,和本文的源代码示例有什么不同。如果事先看了思路讲解和答案,就会失去解题的乐趣,所以这里建议大家先编程解题,再看讲解。

    小编为了大家更好的享受解题乐趣,把“详解”和“答案”放在了最后。

    准备好了吗?我们开始答题吧!

    1.优秀的扫地机器人

    (IQ:80    目标时间:20分钟)

    现在有很多制造商都在卖扫地机器人,它非常有用,能为忙碌的我们分担家务负担。不过我们也很难理解为什么扫地机器人有时候会反复清扫某一个地方。

    假设有一款不会反复清扫同一个地方的机器人,它只能前后左右移动。举个例子,如果第1 次向后移动,那么连续移动3 次时,就会有以下9 种情况( 图6 )。又因为第1 次移动可以是前后左右4 种情况,所以移动3 次时全部路径有9×4 = 36 种。

    ※ 最初的位置用0 表示,其后的移动位置用数字表示。

    问题:

    求这个机器人移动12 次时,有多少种移动路径?

    2.朋友的朋友也是朋友吗

    (IQ:90目标时间:25分钟)

    “六度空间理论”非常有名。大概的意思是1 个人只需要通过6 个中间人就可以和世界上任何1 个人产生间接联系。本题将试着找出数字的好友(这里并不考虑亲密指数)。

    假设拥有同样约数(不包括1)的数字互为“好友”,也就是说,如果两个数字的最大公约数不是1,那么称这两个数互为好友。

    从1~N 中任意选取一个“合数”,求从它开始,要经历几层好友,才能和其他所有的数产生联系(所谓的“合数”是指“有除1 以及自身以外的约数的自然数”)。

    举个例子,N = 10 时,1~10 的合数是4、6、8、9、10 这5 个。

    如果选取的是10,那么10 的好友数字就是公约数为2 的4、6、8这3 个。而9 是6 的好友数字(公约数为3),所以10 只需要经过2 层就可以和9 产生联系(图5 )。如果选取的是6,则只需经过1 层就可以联系到4、8、9、10 这些数字。因此N = 10 时,无论最初选取的合数是什么,最多经过2 层就可以与其他所有数产生联系。


    问题:

    求从1~N 中选取7 个合数时,最多经过6 层就可以与其他所有数产生联系的最小的N。

    3.优雅的IP 地址

    (IQ:100目标时间:30分钟)

    可能大部分读者都清楚,IPv4 中的IP 地址是二进制的32 位数值。不过,这样的数值对我们人类而言可读性比较差,所以我们通常会以8 位为1 组分割,用类似192.168.1.2 这种十进制数来表示它( 图12 )。

    这里,我们思考一下十进制数0~9 这10 个数字各出现1 次的IP 地址(像正常情况一样,省略每组数字首位的0。也就是说,不能像192.168.001.002 这样表示,而要像192.168.1.2 这样来表示)


    问题:

    求用二进制数表示上述形式的IP 地址时,能使二进制数左右对称的IP 地址的个数(用二进制数表示时不省略0,用完整的32 位数表示)。

    4.异性相邻的座次安排

    (IQ:130目标时间:60分钟)

    回想起学生时期调座位的时候,我们的心里总是会小鹿乱撞。想必很多人都对谁会坐自己旁边这件事莫名地激动吧?

    这里我们考虑一种“前后左右的座位上一定都是异性”的座次安排。也就是说,像图26 右侧那样,前后左右都是同性的座次安排是不符合要求的(男生用蓝色表示,女生用灰色表示)。


    问题:

    假设有一个男生和女生分别有15 人的班级,要像图26 那样,排出一个6×5的座次。求满足上述条件的座次安排共多少种(前后或者左右镜像的座次也看作不同的安排。另外,这里不在意具体某个学生坐哪里,只看男生和女生的座次安排)?

    有兴趣的同学可以想想,若想知道答案或者送书的同学,请关于微信公众号"菜鸟学python"

    相关文章

      网友评论

        本文标题:100%的程序员都想挑战的算法趣题|文末送书

        本文链接:https://www.haomeiwen.com/subject/gcpjrxtx.html