面试中纯粹考算法的问题一般是让很多程序员朋友痛恨的,这里分享下我对于解答算法题的一些思路和技巧。

一般关于算法的文章,都是从经典算法讲起,一种一种算法介绍,见得算法多了,自然就有了感悟,但如此学习花费的时间和精力却是过于巨大,也不适合在博客里面交流。这一篇文,却是专门讲快捷思路的,很多人面对算法题的时候几乎是脑子里一片空白,这一篇文章讲的就是从题目下手,把毫无思路的题目打开一个缺口的几种常见技巧。

(一)由简至繁

事实上,很多问题确实是很难在第一时间内得到正确的思路的,这时候可以尝试一种由简至繁的思路。首先把问题规模缩小到非常容易解答的地步。

[题目]有足够量的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-2、n-4、n-6这些钱数,各自补上2分钱,会产生一种新的凑齐n分钱的方法,这些方法的总数+1,就是用1分硬币和2分硬币,凑齐n分钱的方法数了。

在面试时,立刻采用这种思路是一种非常有益的尝试,解决小规模问题可以让你更加熟悉问题,并且慢慢发现问题的特性,最重要的是给你的面试官正面的信号——立即动手分析问题比皱眉冥思苦想看起来好得多。

对于此题而言,我们可以很快发现问题的规模有两个维度:用a1-ak种硬币和凑齐n分钱,所以我们可以记做P(k,n)。当我们发现递归公式 P(k,n) = P(k-1,n - ak) + P(k-1,n - 2*ak) + P(k-1,n - 3*ak) ... ... 时,这个问题已经是迎刃而解了

通常由简至繁的思路,用来解决动态规划问题是非常有效的,当积累了一定量简单问题的解的时候,往往通向更高一层问题的答案已经摆在眼前了。

(二)一分为二

另一种思路,就是把问题一刀斩下,把问题分为两半,变成两个与原来问题同构的问题,能把问题一分为2,就能再一分为4,就能再一分为8,直到分成我们容易解决的问题。当尝试这种思路时,其实只需要考虑两个问题:1.一分为二以后,问题是否被简化了? 2.根据一分为二的两个问题的解,能否方便地得出整个问题的解?

[题目]将一个数组排序。

这个经典算法肯定所有人都熟悉的不能再熟悉了,不过若是从头开始思考这个问题,倒也不是所有人都能想出几种经典的排序算法之一的,这里仅仅是用来做例子说明一分为二的思路的应用。

最简单的一分为二,就是将数组分成两半,分别排序。对于两个有序数组,我们有办法将它合并成一个有序数组,所以这个一分为二的思路是可行的,同样对于已经分成两半的数组,我们还可以将这个数组分作两半,直到我们分好的数组仅有1个元素,1个元素的数组天然就是有序的。不难看出,按这种思路我们得出的是经典数组排序算法中的“归并排序”。

还有另一种一分为二的思路,考虑到自然将数组分成两半合并起来比较复杂,我们可以考虑将数组按照大于和小于某个元素分成两半,这样只要分别解决就可以直接连接成一个有序数组了,同样这个问题也是能够再次一分为二。按照这个思路,则可以得出经典数组排序算法中的“快速排序”。

(三)化虚为实

这种思路针对的是浮点数有关的特殊问题,因为无论是穷举还是二分,对于浮点数相关的计算问题(尤其是计算几何)都难以启效,所以化虚为实,指的是把有点"虚"的浮点数,用整数来替代。具体做法是,把题目中给出的一些浮点数(不限于浮点数,我们不关心其具体大小的整数也可以)排序,然后用浮点数的序号代替本身来思考问题,等到具体计算时再替换回来。

[题目]已知n个边水平竖直的矩形(用四元组[x1,y1,x2,y2]表示),求它们的总共覆盖面积。

因为坐标可能出现浮点数,所以此题看起来十分繁复(可以实践上面由简至繁和一分为二的思路都基本无效),略一思考,矩形的覆盖关系其实只跟矩形坐标的大小有关,所以我们尝试思考将矩形的所有x值排序,然后用序号代替具体竖直,y值亦然,于是我们得到所有矩形其实处于一个2nx2n的区块当中,这样我们用最简单的穷举办法,可以计算出每一个1x1的格子是否被覆盖住了。至此,只要我们计算面积的时候,把格子的真实长宽换算回来,就已经得到题目的答案了。

本文是某天在QQ群里讨论面试时的算法问题时想到要写的,以上三种思路,是我平时遇到算法问题的快速思考方向,并非万灵药方,若是不能生效,就要静下心来慢慢思考观察了,考虑到面试的时候基本不会遇到高难度算法题,这几种技巧的命中率应该不会太低,共享给大家,希望有所帮助。

from: http://www.cnblogs.com/winter-cn/archive/2011/03/01/1960267.html

面试时算法题的解答思路相关推荐

  1. 面试时算法为什么如此重要?高薪,外企,为什么迟迟没有进入?

    为什么明明面试题比工作遇到的算法已经简单那么多,面试的时候面一下算法还是让很多人义愤填膺呢? 收藏人:木立 2014-03-22 | 阅:639  转:0   |   来源   |  分享    13 ...

  2. 2019多益笔试编程和面试的算法题

    2019多益笔试编程和面试的算法题 多益网络笔试编程题:字符串的指定位数组合 原题概述(只记得大概): 题目解答 多益网络面试算法题:不用比较找出两数中的较大值和较小值 原题概述: 题目解答 代码示例 ...

  3. 为什么程序员都很排斥面试时做题?答不出题的程序员会是大牛吗?

    相信很多人都有过这样的经历,就是去面试的时候,先被要求做题. 如果像下面的判断选择还好! 如果是让写个什么算法之类的,那就呵呵了!每天和鼠标握手,还哪会写字啊! 关于这件事,很多小伙伴纷纷吐槽. 网友 ...

  4. 2011下半年案例分析题的解答思路_信息系统项目管理师考试

    2011下半年案例分析题的解答思路_信息系统项目管理师考试 试题1 请参见<信息系统项目管理师考试案例梳理.真题透解与强化训练>P124  模拟试题7 试题2 请参见<信息系统项目管 ...

  5. 语言高精度算法阶乘_JavaScript中的算法(附10道面试常见算法题解决方法和思路)...

    https://juejin.im/post/6844903811505455118 Introduction 面试过程通常从最初的电话面试开始,然后是现场面试,检查编程技能和文化契合度.几乎毫无例外 ...

  6. 面试经典算法题集锦——《剑指 offer》小结

    本文转载自: http://www.cnblogs.com/fanling999/p/7810558.html 作者:fanling999 转载请注明该声明. 从今年 3 月份开始准备找实习,到现在校 ...

  7. 面试高频算法题补充系列:木棍切割问题

    前言 了解更多常考高频算法题可以关注 公众号:一个搬砖的胖子 高频算法网站:https://codetop.cc/ 小程序:CodeTop 此题经常在字节跳动后端面试中遇到,尤其是教育部门的三面.我押 ...

  8. 面试高频算法题补充系列:如何判断一个点是否在三角形内?

    前言 了解更多常考高频算法题可以关注 公众号:一个搬砖的胖子 企业面试题库:https://codetop.cc/ 小程序:CodeTop 该题曾出现在字节跳动.腾讯.网易.美团.小马智行等公司的面试 ...

  9. 四道微软面试经典算法题

    比较经典的四个算法题,目前只收集到相关的思路和个别题目的解法,不断更新中 1.一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现.0是例外,可以反复出现. 请设计一个算法, ...

最新文章

  1. 关于java中的各种流
  2. 牛逼啊!一个可以随时随地写Python代码的神器
  3. Zedboard学习(二):zedboard的Linux下交叉编译环境搭建
  4. 有时间了要研究一下Stack Exchange的开源项目
  5. 【问题解决方案】git clone失败的分析和解决
  6. qq浏览文件服务器,腾讯浏览服务
  7. 使用SVM分类器进行图像多分类
  8. SpringSecurity实战(四)-集成图片验证码-过滤器方式实现
  9. 安卓系统目录说明大全,各文件夹是什么,可以删除吗?(以MIUI为例)
  10. BaseFX 实习小记(四)
  11. 小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖
  12. Apache Pulsar:实时数据处理中消息,计算和存储的统一
  13. 【人工智能】5.不确定性推理
  14. 高斯白噪声及Matlab常用实现方法
  15. 2018.4.3 美图笔试题
  16. LaTex--4--各种文件类型
  17. 电气控制基础-解析软启动器
  18. 【table-4】带斑马纹的表格样式、动态更改表格中某一个单元格字体颜色
  19. 写过Flex的非Flex人士
  20. 【Spring实战学习笔记】第4章 面向切面的Spring

热门文章

  1. 百度大脑险胜最强大脑背后:200万人2亿照片做训练
  2. linux驱动读取文件失败怎么办,linux – 由于单个驱动器读取错误导致软件RAID-1导致内核故障...
  3. mysql zf,mysql workbench建表时PK,NN,UQ,BIN,UN,ZF,AI的含义
  4. ADSL宽带为什么下载和上传速度差别如此之大?
  5. APM - 零侵入监控JDBC服务
  6. JVM - 写了这么多年代码,你还不知道new对象背后的逻辑?
  7. MySQL-分库分表初探
  8. 实战SSM_O2O商铺_23【商铺列表】Controller层开发
  9. Centos6.5安装/运行/启动/登录docker
  10. C++五子棋(六)——游戏结束