现在的位置: 首页 > 综合 > 正文

曾遇到的算法面试题

2014年02月19日 ⁄ 综合 ⁄ 共 1799字 ⁄ 字号 评论关闭

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

总结:

这个题打死我,我也想不出来,但是所有的体育生应该都会。面试官告诉我,主要看我的解题思路,我真的是没有其他思路了。我多么希望我是一个足球迷啊~~~

抱歉!评论已关闭.