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

点击上方“菜鸟学Python”,选“星标”公众号

重磅干货,第一时间领取

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


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,前端开发等优质的学习资源和技术,分享一些程序员圈的新鲜趣事。

推荐阅读:这个GitHub 1400星的Git魔法书火了,斯坦福校友出品丨有中文版贼 TM 好用的 Java 工具类库
超全Python IDE武器库大总结,优缺点一目了然!
秋招来袭!GitHub28.5颗星!这个汇聚阿里,腾讯,百度,美团,头条的面试题库必须安利!
收获10400颗星!这个Python库有点黑科技,竟然可以伪造很多'假'的数据!
牛掰了!这个Python库有点逆天了,竟然能把图片,视频无损清晰放大!


点这里,获取一大波福利
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值