面试中纯粹考算法的问题通常是让不少程序员朋友痛恨的,这里分享下我对于解答算法题的一些思路和技巧。程序员
通常关于算法的文章,都是从经典算法讲起,一种一种算法介绍,见得算法多了,天然就有了感悟,但如此学习花费的时间和精力倒是过于巨大,也不适合在博客里面交流。这一篇文,倒是专门讲快捷思路的,不少人面对算法题的时候几乎是脑子里一片空白,这一篇文章讲的就是从题目下手,把毫无思路的题目打开一个缺口的几种常见技巧。
另外本人整理收藏了20年多家公司面试知识点整理 ,以及各类Java核心知识点免费分享给你们,我认为对面试来讲是很是有用的,想要资料的话请加群1149778920 暗号: qf 来自行领取。**
面试
(一)由简至繁
事实上,不少问题确实是很难在第一时间内获得正确的思路的,这时候能够尝试一种由简至繁的思路。首先把问题规模缩小到很是容易解答的地步。算法
[题目]有足够量的2分、5分、1分硬币,请问凑齐1元钱有多少种方法?数组
此题乍看上去,只会以为彻底没法入手,可是按照由简至繁的思路,咱们能够先考虑极端简单的状况,假如把问题规模缩小成:有足够量的1分硬币,请问凑齐1分钱有多少种方法?毫无疑问,答案是1。多线程
获得这一答案以后,咱们能够略微扩大问题的规模: 有足够量的1分硬币,凑齐2分钱有多少种方法?凑齐n分钱有多少种方法?答案仍然是1微服务
接下来,咱们能够从另外一个角度来扩大问题,有足够量的1分硬币和2分硬币,凑齐n分钱有多少种方法?这时咱们手里已经有了有足够量的1分硬币,凑齐任意多钱都只有1种方法,那么只用1分钱凑齐n-2分钱,有1种方法,只用1分钱凑齐n-4分钱,有1种方法,只用1分钱凑齐n-6分钱,有1种方法…学习
而凑齐这些n-二、n-四、n-6这些钱数,各自补上2分钱,会产生一种新的凑齐n分钱的方法,这些方法的总数+1,就是用1分硬币和2分硬币,凑齐n分钱的方法数了。spa
在面试时,马上采用这种思路是一种很是有益的尝试,解决小规模问题可让你更加熟悉问题,而且慢慢发现问题的特性,最重要的是给你的面试官正面的信号——当即动手分析问题比皱眉左思右想看起来好得多。线程
对于此题而言,咱们能够很快发现问题的规模有两个维度:用a1-ak种硬币和凑齐n分钱,因此咱们能够记作P(k,n)。当咱们发现递归公式 P(k,n) = P(k-1,n - ak) + P(k-1,n - 2ak) + P(k-1,n - 3ak) … … 时,这个问题已是迎刃而解了blog
一般由简至繁的思路,用来解决动态规划问题是很是有效的,当积累了必定量简单问题的解的时候,每每通向更高一层问题的答案已经摆在眼前了。
(二)一分为二
另外一种思路,就是把问题一刀斩下,把问题分为两半,变成两个与原来问题同构的问题,能把问题一分为2,就能再一分为4,就能再一分为8,直到分红咱们容易解决的问题。当尝试这种思路时,其实只须要考虑两个问题:1.一分为二之后,问题是否被简化了? 2.根据一分为二的两个问题的解,可否方便地得出整个问题的解?
[题目]将一个数组排序。
这个经典算法确定全部人都熟悉的不能再熟悉了,不过如果从头开始思考这个问题,倒也不是全部人都能想出几种经典的排序算法之一的,这里仅仅是用来作例子说明一分为二的思路的应用。
最简单的一分为二,就是将数组分红两半,分别排序。对于两个有序数组,咱们有办法将它合并成一个有序数组,因此这个一分为二的思路是可行的,一样对于已经分红两半的数组,咱们还能够将这个数组分做两半,直到咱们分好的数组仅有1个元素,1个元素的数组自然就是有序的。不难看出,按这种思路咱们得出的是经典数组排序算法中的“归并排序”。
还有另外一种一分为二的思路,考虑到天然将数组分红两半合并起来比较复杂,咱们能够考虑将数组按照大于和小于某个元素分红两半,这样只要分别解决就能够直接链接成一个有序数组了,一样这个问题也是可以再次一分为二。按照这个思路,则能够得出经典数组排序算法中的“快速排序”。
(三)化虚为实
这种思路针对的是浮点数有关的特殊问题,由于不管是穷举仍是二分,对于浮点数相关的计算问题(尤为是计算几何)都难以启效,因此化虚为实,指的是把有点"虚"的浮点数,用整数来替代。具体作法是,把题目中给出的一些浮点数(不限于浮点数,咱们不关心其具体大小的整数也能够)排序,而后用浮点数的序号代替自己来思考问题,等到具体计算时再替换回来。
[题目]已知n个边水平竖直的矩形(用四元组[x1,y1,x2,y2]表示),求它们的总共覆盖面积。
由于坐标可能出现浮点数,因此此题看起来十分繁复(能够实践上面由简至繁和一分为二的思路都基本无效),略一思考,矩形的覆盖关系其实只跟矩形坐标的大小有关,因此咱们尝试思考将矩形的全部x值排序,而后用序号代替具体竖直,y值亦然,因而咱们获得全部矩形其实处于一个2nx2n的区块当中,这样咱们用最简单的穷举办法,能够计算出每个1x1的格子是否被覆盖住了。至此,只要咱们计算面积的时候,把格子的真实长宽换算回来,就已经获得题目的答案了。
文末
本文以上三种思路,是我平时遇到算法问题的快速思考方向,并不是万灵药方,如果不能生效,就要静下心来慢慢思考观察了,考虑到面试的时候基本不会遇到高难度算法题,这几种技巧的命中率应该不会过低,共享给你们,但愿有所帮助
近段时间正值找工做的最佳时间,想要获取更多的多线程或与微服务相关问题还有2020最近各大厂商的面试真题的能够加群1149778920 来和咱们一块儿分享和交流,暗号:qf
如下是部分资料截图(全部资料均已整合成文档,pdf压缩打包处理)。
**