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