2020年大厂敲门砖--巧刷算法题

????????关注后回复 “进群” ,拉你进程序员交流群????????

作者丨成小灰

来源丨Coder的技术之路

纵观这么多年,今年的技术面试是真的麻烦,不知道被哪家公司带坏了,所有的公司都开始考算法题。  我不排斥算法,它可以考察思维、考察编码习惯、考察基础能力;

但是比较排斥那些心理扭曲的面试官,不报有任何目的,单纯为了体现他的优越感,那变态的优越感  而出的那些变态的题,没有任何卵用。。。然而主动权不在我们。

包括我,应该有不少同学在看算法题的时候不知道该从和下手,万物皆可盘,今天就来盘下常见的那些敲门砖。


一、从数据结构上看

本质上基本都是  数组 和 链表 

有人说,不对啊 还有树啊,栈啊等等。不过,我们仔细一想就会发现,更高级的数据结构,也逃不开这两种,就拿树来说,其实就是一个链表,只不过,之前只有一个next,现在变成了两个,为了区分,就叫成了left和right。

所以,数组和链表的特性和基本操作,是基本大部分算法题的基础,是一定要掌握牢靠的。像数组的二分、链表的双指针之类都是由其对应的特性演化而来。

比如,本人最近被问过好几次的LRU缓存算法,就是一个比较典型的链表操作的运用。

一般可以用链表+hashMap的方式来实现:当查询时缓存中有,则从链表中找到该值,并移动到头部(从原位置删除并插入头部);如果缓存中没有则考虑插入,如果空间未满,则直接插入到头部,如果空间已满,则需要将尾部的元素删除。

类似这种比较简单的题,主要考察的其实是对整个结果设计的细节把控,比如触发缓存变动的时机,节点的插入和删除等等,脱离了强大的 intellij idea ,能较少问题的快速编译成功,还是要一点功夫的。


二、从考察角度来看

2.1 编码细节考察

可能算法本身不难,主要是得关注在实现过程中细节的把控,比如异常判断、边界值的选择、编码风格的简洁规范。这种题一般都要求编译成功并实例跑通。

题 :实现大整数加法 

写法一:

写法二:

相比之下,第二种在风格、写法上可能更优些,Java语法本身相比python这些就已经很冗余了,我们更应该注意尽量把程序写的简洁易懂些才好。

这个题很多同学会直接用到StringBuilder的反转功能,面试官可能会要求不能使用现有反转功能,那可能需要考虑采用额外的存储来存放我们的结果,最后再进行反转,可能链表是一个不错的选择。

2.2 思维能力考查

从分析问题到给出解法到逐步优化的逻辑思维,这类题一般只需要给出思路,分析出时间和空间复杂度,最多写出类似伪代码的逻辑框架我理解就可以了;

回溯问题

给N个递增数组,每个数组中只取一个数,要求选出的这N个数的方差最小。

千万别被方差这个有点生疏的概念吓到,无非就是选值最接近的N个数,即使你真的忘了啥是方差,直接问问也不妨事,除非面试官是为了装逼他也不会,那可能场面就有点尴尬了。。。

说实话这道题至今还是没有想到一个特别优的解法,也在脉脉放出来和大家交流了下,无非是用N个指针初始化到每个数组的第0位,然后通过计算均值,来选择离均值最远的一个进行移动,和算K-means的那种感觉似的,直接稳定;有个号称微软员工的大佬给出了一个叫KDTree的思路,咱也不懂,有懂的朋友可以留言交流下。

重新反过来看上面这道题,是不是感觉有点像八皇后,都是每行选一个,从8皇后的不同列的限制,变成了本题的方差最小的限制

对于8皇后经典的回溯问题,大致解法如下

回溯,其实就是一个带现场维护的一个递归(记录现场,递归,恢复现场),所以,我们可以从这个经典问题中看到什么? 

全是套路!

把8皇后的解法抽象一下,一个解决递归类问题的模板出来了。。。

那么,我们上面描述的那个方差最小的问题,是不是可以按这个套路来搞呢。

题:动态规划问题

给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法

//定义状态dp ,dp[i] 标示的是组装成i分钱的方法个数
int[] dp = newint[n + 1]; 
//dp[0] 是最初的状态,可以当成终止条件或基础条件
dp[0] = 1;
//状态转移方式,当前的方法数,依赖于不选当前硬币的前一个状态
dp[k] += dp[k - coin];
//最终实现
for(int coin : coins) {
    for(int i = coin; i <= n; i++) {
        dp[i] = dp[i] + dp[i - coin]
    }
}

动态规划或者说是最优化问题,不管是生产开发还是算法绕不开的主题。此类问题最重要的两个问题是状态的定义和状态转移,所以,我们是不是又可以总结一个动态规划的模板:

当然,dp状态推导还是要通过练来找找感觉了。


三、‘脑筋急转弯’  猪撞树上了

当然,能考出来的还是有点绕的,直观感受上应该是要比行测题要绕一些的

题:36匹马,6条跑道,最少跑几次可以找到最快的前三匹马?

还有,是开水团的一大爷问,怎么知道当前北京上空,有几架飞机?

第一个还有点谱,起码是在考思维,第二个这个就太那个了,网上搜了下,曾经某国外的信息咨询公司在招聘时问过此类问题,主要考察的是候选人的信息收集能力,我就想问,这个和技术、思维有个啥关系。。。

林子大了 ,什么鸟也能遇的到。


总结:

算法是个好东西,多练对思维 对编程习惯都有些好处,当前在刷题的时候也要善于总结,比如文中提到的回溯,我们可以从经典的问题中提取出一套通用的模板,甚至,我们再细研究就会发现,他实际上是树的遍历,只不过是把二叉树扩展到了N叉树上。

就算不找工作,时不时的刷刷,提前防下老年痴呆也是很不错的~ 

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击????卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值