知乎高赞!2道大厂高频笔试算法题!你会吗?

对于如今找工作的小伙伴们,只要是涉及到编程的岗位,无一例外都会对编程进行考察,所以大家要在平时的学习中,多多的去练习编程,提高自己的编程能力。今天,小编就带领大家来学习两道出现频率较高的趣味笔试题,让大家在学习的过程中,来提高进步。

01 两地调度为题

1).题目描述:公司计划面试 2N 人。第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]。

返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵达。例如:

输入:[[10,20],[30,200],[400,50],[30,20]]输出:110解释:第一个人去 A 市,费用为 10。第二个人去 A 市,费用为 30。第三个人去 B 市,费用为 50。第四个人去 B 市,费用为 20。

最低总费用为 10 + 30 + 50 + 20 = 110,每个城市都有一半的人在面试。

2).思路

面对这种问题,我们可以采用贪心算法来解决。

原因是,我们针对每一个人都找到他去往A地或者是B地的最低费用,而这样的局部最优解就能够组成全局的最优解。

这道题中,先把输入的数组按照两地的费用之差的绝对值进行升序排序,然后当去往A地和B地都还有名额的时候,就去花费比较小的目的地。

如果去A地的名额满了,那剩下的人肯定都得去B地,同理如果去B地的满了,剩下的人都得去A地。

3).基础解法:

上图中的程序是基础的解法,可以看到首先将费用列表按照费用差进行升序排序,然后根据去往A地和B地的人数以及费用的大小来判断去往A地还是B地。程序总体是按照我们的思路来进行编写的,非常容易理解。

4).进阶版:

进阶版的程序更加的巧妙,这是为什么呢,首先,程序不再按照绝对值进行升序排序了,而是按照去往A地和去往B地的费用差值来排序,排序之后由于去往A地和B地都是总人数的一半,所以排序后的前一半的人,去往A地是最便宜的,而后一半的人是去往B地最便宜的,基于这个思路,程序就很容易理解了。

02 反转二叉树

对于二叉树的考察,无论是在笔试还是面试中,都会是考察的重点问题,我们今天来理解一下高频的笔试面试题,反转二叉树。对于二叉树的反转,这里采用一个动态图进行更加直观的展示,来方便大家的理解。

1).思路:可以看到,反转二叉树就是从根节点开始,左右子树全部交换,左子树变为右子树,从上图我们也可以看出,这是一个典型的递归问题,也就是我们可以通过不断的递归迭代来交换一棵树的左右子节点,来达到整体的反转二叉树的目的。

2).递归版本:

上述的程序中,可以看到,当节点是None时,说明达到了叶子节点了,此时返回None,否则的话,就不断的递归调用函数本身,来反转该节点下的左子树和右子树,从而达到反转二叉树的目的。

除了有递归迭代的版本之外,可以利用queue的特点来实现二叉树的反转,queue的特点是先进先出。

3).Queue版本:

上述的程序中,首先我们判断root是否为空,为空的话则直接返回None即可。接下来就是利用queue,只要queue不为空,那么我们就pop掉queue中的最后一个元;然后反转它的左右子节点,如果该子节点的左右子树不为空,就添加到myqueue中,继续循环,来反转其左右子树的子节点。以此来达到反转整个二叉树的目的;可以看到,queue的版本中,并没有用到函数的递归迭代,而时用到了queue的先进先出的性质来进行了二叉树的反转。

总结

今天,带领大家学习了两个高频的笔试面试算法题,大家要仔细的将程序理解,并要学会如何巧妙的使用这些算法,来解决其他类似的算法题,只有勤加练习,才能成为高手,希望大家能在日常中,多多刷题,提高自己的能力。

程序员GitHub,现已正式上线!

接下来我们将会在该公众号上,专注为大家分享GitHub上有趣的开源库包括Python,Java,Go,前端开发等优质的学习资源和技术,分享一些程序员圈的新鲜趣事。

目前wx搜索Python 【菜鸟学Python】排第二,汇聚了30万Python爱好者,累计原创近400篇趣味干货(爬虫,数据分析,算法,面试指南,原创趣味实战,Python游戏,机器学习),欢迎一起学Python,交流指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章