曾遇到的算法面试题
2012-08-14 20:55
155 查看
2012-08-14 百度商务搜索:
问题描述:
对现在的Stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即O(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是O(1)。解决方案:
在栈的每个元素加一个属性值 min (用于记录当前位置下面的元素的最小值),元素的值用key表示
压栈-Push:当压入的元素key小于当前栈顶元素的min值时,将新压入元素的min字段设置为新压入元素的key,否则,将新压入元素的min字段,设置为当前栈顶元素的min字段的值(压入第一个元素时,直接设置当前 min <- key)
出栈-Pop:和以前一样删除就行
这样栈顶元素中的min字段,存储的就是栈中的最小值, 删除也不用额外的比较操作~
总结:
(1)该题目看似是考察算法,其实是在考察对数据结构的掌握,当时自己没有做出来,记得面试准备前看到过这个题目,扫了一眼就过了,并没有真正的理解。现在再看,恍然大悟。
(2)算法的推理一般来说需要归纳法(通过该问题总结出的个人见解),对于该题目,可以随机的向栈内,添加数据,然后标记处此时栈的最小值,当添加4~5个栈元素后,可以看看当前自己构造的栈数据和最小栈元素的分布规律,问题是否是迎刃而解呢。(有点事后诸葛亮,但是应该是这个道理不差)
2012-08-07 甲骨文嵌入式java部门面试:
问题描述:
有一个整型数组,数组中的元素都是排好序的,但是数值并不是连续的,给出一个数据M,请实现一个函数从数组中找出不大于M的最大的数。(提示:请使用二分搜索实现)举个例子:array[] = {1,3,4,5,6,7,9,10},M=8,则函数应该返回7.
解决方案:
我当时的方法(当时用纸写出的应该是存在Bug的,这是回家整理的,经过了测试):3 int search(int array[], int len, int num) 4 { 5 int l = 0; 6 int u = len - 1; 7 int m = 0; 8 int find = array[0]; 9 10 while (l <= u) 11 { 12 m = (l + u) / 2; 13 printf("l=%2d,u=%2d,m=%2d, array[m]=%d\n", l, u, m, array[m]); 14 15 if (array[m] == num) 16 { 17 find = array[m]; 18 break; 19 } 20 else if (array[m] > num) 21 { 22 u = m - 1; 23 } 24 else 25 { 26 l = m + 1; 27 find = array[m]; //该题的关键 28 } 29 } 30 31 return find; 32 }
总结:
一般的二分搜索是查找一个指定的数值,该题目是查找一个不大于指定数值的最大值,如果数组中存在指定值,则就是普通的二分搜索,否则,返回最后一次比较时小于指定值得数就是所要查找的。因此该题的基础首先是你得写出二分搜索算法,然后稍加修改即可。(基础是多么的重要!)问题描述:
给定一个unsigned int,请按照个十百千万亿的方法输出。如1230989009=拾贰亿叁仟零玖拾捌万玖仟零玖解决方案:
我再解决的时候想的太麻烦了,不误导大家了。面试官最后告诉我了一个简便的方法,填空法,如下:4294967295-无符号数能表示的最大数组,最大不超过百亿,那么构造如下的填空题__拾__亿__仟__佰__拾__万__仟__佰__拾__,
1230989009=
_1_拾_2_亿_3_仟_0_佰_9_拾_8_万_9_仟_0_佰_0_拾_9_,填空后再注意零的输出即可。
总结:
后悔去银行汇款排队时,没仔细观察银行的单据(是不是很像)问题描述:
20个足球队打循环赛,每周可以进行10场比赛,不考虑主客场,同一个球队每周只能参赛一次,请问如何得所有的出赛程安排。解决方案:
我的方案:是先穷举出所有的比赛组合(两个球队之前),然后在根据每周只能参赛一次这个条件选择出10个组合,比赛完成后,将这10个组合从所有比赛组合中删除,下周再从剩余的组合中选择出10个。——面试官问我更优的方法,想了半天也没想出来。
标准方案:单循环赛算法
http://baike.baidu.com/view/1708502.htm
总结:
这个题打死我,我也想不出来,但是所有的体育生应该都会。面试官告诉我,主要看我的解题思路,我真的是没有其他思路了。我多么希望我是一个足球迷啊~~~相关文章推荐
- 那些年遇到的算法面试题
- 曾经遇到的一个面试题,快速排序用链表实现,算法和以前的相似,需要注意一些细节处理
- 【那些年遇到过的面试题】 内存管理算法--Buddy伙伴算法
- 经常遇到的面试题
- 【那些年遇到过的面试题】gdb调试多线程
- 各大公司经典算法面试题
- 算法面试题-leetcode学习之旅(一)
- 遇到的一个sql的面试题
- 程序员面试题精选100题(57)-O(n)时间的排序[算法]
- 算法面试题
- 腾讯算法面试题算法与代码
- 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
- 程序员面试题精选100题(34)-数组中只出现一次的数字[算法]
- 昨天遇到的一道JavaScript面试题,求y和z的值是多少
- 面试遇到的面试题分析
- 给出我的华为的一道面试题算法
- 算法系列-大数据面试题-两个大文件中找出共同记录
- Java经典算法题目面试题经常出现的
- 前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]
- 算法方面面试题及个人解答