知识大全 程序员面试—5大算法
Posted 面试
篇首语:当筵意气临九霄,星离雨散不终朝。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 程序员面试—5大算法相关的知识,希望对你有一定的参考价值。
其实解决复杂的算法问题时并没有什么良方高招 但是下面的介绍的 种方法还是有一定的实用性 下面的方法你练习的越多 就越能鉴别出用什么方法来解决问题
这 种方法并不是彼此独立的 也可能会交叉起来使用 比如同一个问题可能会用到 简化和一般化 和 套用常见方法 两种方法
法 举例法
说明 举出个普通的例子 看看是否能够发现其中的规则
例 给出任意一个时间点 计算出时针和分针之间的夹角 解法:首先从 : 这个例子出发 通过画示意图 观察时针和分针的角度 我们会发现下面的规律 *以 位置为起始点 那么分针的角度则是 *minute/ *以 位置为起始点 那么时针的角度则是 *(hour% )/ + *(minutes/ )*( / ) *那两个指针之间的夹角是 (hour angle &# ; minute angle)% 化简上述式子就得到最后的公式: * hours &# ; * minutes
法 套用常见方法
说明 如果出现的这个问题和之前用某个算法结果过的问题比较类似 就可以尝试改进原算法解决这个新问题
例 一个经过排序的数组再做一次循环移动 那么数组中的数字可能是这样的 那你如何找到数组中最小值呢? 相似的问题: * 在数组中查找最小值 * 在数组中查找查找一个特殊的值(例如 二分查找) 算法 查找最值并不是什么特别东西(你可以遍历数组然后找到最小值 即使提供了一些额外的信息 比如:数组已近排序) 刚才问题上额外信息似乎没有什么用 但是二分查找好像比较有用 因为给出的条件说数组已经排序过了 可是还做了一次循环移动 那么这个数组的模式应该这样的 先是升序 突然重置 接着继续升序 那么这个重置点就是最小值 比较第一个这个中间的元素( 和 ) 这个是升序的 那么这说明了这个重置点在 之后的那一段(或者 就是最小是 因为数组没有循环移动过) 那么我可以继续采用这样方法进行二分查找 如果左边小于右边 说明重置点不在这个范围内 如果左边大于右边则重置点在这个范围内 继续进行二分查找
法 简化&一般化
说明 通过改变一些条件 (比如数据类型或者问题的规模)来简化问题 然后设计一个算法来解决这个简化过的问题 然后在问题一般化还原回来
例 一份敲诈信可以用从杂志上剪下来的单词拼凑出来 给出一份敲诈信(字符串) 你问是否能从给定的杂志中拼出来敲诈信 简化 将问题简化成给定一份字符 问是否能够拼成一个单词 算法 对于这个简化的问题 我可以先创建一个数组用来给统计字符出现的次数 首先我们计算每个字母在敲诈信中出现的个数 然后在给出的字符串集合中是否有这么多的字母 再 一般化 还原这个问题 我们可以采用非常类似的方法 这次我们采用的创建一个哈希表来映射每个单词映出现的次数
法 简单构造法
说明 从最基本的情况来解决问题(比如只有一个元素) 然后再推导出有两个元素的情况 再利用一个元素和两个元素的结论推导出三个元素的情况
例 设计算法打印出一串字符的全排列 假设所有的字符都不同 测试字符串 abcdefg a 全排列为 a ab 全排列为 ab ba abc 全排列为 ? 通过上面例子我们不能发现 如果我们知道P(&# ;ab&# ;) 我们就能生成P( abc ) 我只需要将新加入的字母&# ;c&# ;插入到每个可以插入位置即可 如下 merge(c ab) &# ;> cab acb abc merge(c ba) &# ;> cba bca bac 算法 递归 先截去字符串中的最后一个字母 生成所有s[ …n ]的全排列 然后再将最后一个字母插入到每一个可插入的位置 注意 一般采用这样的构造法大多都会用到递归
法 数据结构头脑风暴
说明 方法看起来有点笨 但是很实用 过一遍数据结构然后看看哪个最适合解这个问题
例 随机生成的数字 一个一个存到可扩展的数组中 如何跟踪数组的中位数 数据结构头脑风暴 * 链表 不太行 因为链表在随机访问和排序上性能不好 * 数组 可能 但是你已经有一个数组了 还要一直保持数组中的数字有序 开销会比较大了 我们暂时先不选它 但可以作为备选项 * 二叉树 有可能 因为二叉树在排序方面有很好的表现 如果二叉树是平衡的话 那么根节点就是中位数 但是注意 如果数组中有偶数个元素时 中位数应该是中间两个数的平均值 而根节点不可能是两个数的 结论 可能可行 待定 * 堆 堆确在排序 查找最大值/最小值有很好的性能 如果你创建两个堆 一个是最大堆 一个最小堆 一个堆堆顶记录数组较小一半的最大值 另外一个堆顶记录较大值的最小值 这样的结构下 两个堆如果 平衡 的话 那堆顶的数字就可能是需要的中位数了 如果两个堆 不平衡(堆的大小不一样) 可以从元素多的堆中弹出堆顶的元素到另外一个堆 保持平衡
cha138/Article/program/sjjg/201405/30929相关参考
知识大全 公务员考试我差第一名12.5分,面试百分制,算法5比5,我得比第一名面试
公务员考试我差第一名12.5分,面试百分制,算法5比5,我得比第一名面试你面试比他高12.5分以上呗而且其他人可能面试成绩比你、比第一还高(其实差十分以上可以放弃了,逆转太难,除非对手是菜B)2010
(1)一个整数数列,元素取值可能是0—65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。注意-5个数值
一单链表目录单链表反转找出单链表的倒数第个元素找出单链表的中间元素删除无头单链表的一个节点两个不交叉的有序链表的合并有个二级单链表其中每个元素都含有一个指向一个单链表的指针写程序把这个二级链表称一级单
该算法虽然直观有效但没有给出具体的实现为了比较三种算法的优劣文中基于该算法思想给出了具体的实现源程序如下charsz[][];//存储出栈序列intused;//出栈序列总数voidstack_out
调用子程序的含义 在过程和函数的学习中我们知道调用子程序的一般形式是主程序调用子程序A子程序A调用子程序B如图如示这个过程实际上是 > @当主程序执行到调用子程序A语句时系统保存一些必要的现
PHP中奖概率的抽奖算法程序代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 初期就这些需求然
Java中国象棋博弈程序探秘之搜索算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 搜索是电脑
cha138/Article/program/sjjg/201404/30583
为了解决理解与执行这两者之间的矛盾人们常常使用一种称为伪码语言的描述方法来进行算法描述伪码语言介于高级程序设计语言和自然语言之间它忽略高级程序设计语言中一些严格的语法规则与描述细节因此它比程序设计
腾讯算法题服务器内存G有一个G的文件里面每行存著一个QQ号(位数)怎么最快找出出现过最多次的QQ号G内存两个G的文件每个文件格式为每行是一个url地址找出这个两个文件中重复的url地址(典型的url去