0

我是一个无情的面试官。

面人无数,挂人无数。

若想过我的面试,标准只有一个,那就是公司很缺人。

招新人,填旧坑。

1

今天是我的第1001次当面试官,要求却不是千里挑一,而是一击必中。

因为我招聘的KPI快完不成了。

对面的小伙子,我和他从HTTP协议谈到负载均衡,从类的命名规范谈到JVM调优,凡是搬砖用不到的,我们都聊了一遍,相谈甚欢。

我知道我们是一路人,都是为面试而学习。

好了,已经快一个半小时了,我只会问最后一个问题了。

他若回答上来了,我俩之蜜糖。

他若回答不上来,我俩之砒霜。

最后一题,必是算法。

行业规则,我必遵从。

2

我不急不忙,把题目念给他听。

重新定义一个栈的数据结构 ,在该类型中实现一个能够得到栈的最小值的min函数,并且调用push pop min函数的时间复杂度都是O(1)

讲完题目,他的眼神从惊喜,到思索,再到不解。

我便知道他刷过这道题,他也知道自己刷过这道题,但是他还是假装不知道自己刷过这道题。

此时此刻,他不像程序员,像演员。

他略加思索,说了一个他自己都觉得不是合理的答案,但他还是说了出来:

"我首先想到的是,新增一个成员变量来存放最小的元素,每次入栈的时候,如果新元素比该成员变量的值还小的时候,则将该成员变量更新为新元素的值。"

我微微一笑:"那如果记录最小的元素已经出栈了,如何得到下一个最小的元素呢?"。

他假装恍然大悟:"是啊 ,确实。"。

于是他拿着笔,看着纸,仿佛在思考怎么表演的这答案更是自己想出来的。

我知道,这个是面试套路,他若直接说出来最佳答案,身为面试官的我难免不会拓展这个题目,相反,他要假装说出来一个不太好的答案,在我的提示下,他聪明的想到了最优解法。

我有了面子,毕竟在我的指导下他才解决问题。

他有了里子,在紧张的环境下他仍能快速思考。

3

果然,不久他就说:“我有思路了!”

然后开始默写答案,顺便还把用作讲解的图画了出来。

写完之后,他娓娓道来:"您看,确实是仅仅记录最小元素是不够的,还要记录当前栈中第二小元素,第三小元素。。。为了保存这些元素,我采用了一个辅助栈"。

举个例子

当插入第一个元素5的时候,显然5是当前的最小值,主栈与辅助栈同时插入

当插入第二个元素4的时候,由于4小于当前的辅助栈栈顶元素,即4是当前的最小元素,则将辅助栈压入4。

当插入第三个元素6的时候,由于6大于当前的辅助栈栈顶元素4,则仍然将辅助栈压入4。

当插入第四个元素3的时候,由于3小于当前的辅助栈栈顶元素4,此时最小值应为3,则将辅助栈压入3。

所以 ,如果我一直将当前最小元素压入辅助栈,那么就能保证辅助栈的栈顶元素都是最小元素。

如果出栈的时候,主栈弹出数据之后,辅助栈会一起弹出数据,即辅助栈的栈顶一直都是当前栈的最小元素。

比如 ,我第一次弹出 主栈的数字3 之后,辅助栈一起弹出,当前最小值为4]

我第二次弹出 主栈的数字6之后,辅助栈一起弹出,当前最小值依然为4

依次类比。

下面是我写的代码


import java.util.Stack; class MinStack { private Stack<Integer> stack;
private Stack<Integer> minStack; public MinStack() {
stack=new Stack<>();
minStack=new Stack<>();
} public void push(int x) {
stack.push(x);
if(minStack.isEmpty())
minStack.push(x);
else
minStack.push(minStack.peek()<x ? minStack.peek():x);
} public void pop() {
stack.pop();
minStack.pop();
} public int min() {
return minStack.peek();
}
}

其实很好,这时候我已经决定要他了,而且快中午,再不结束面试,食堂东坡肘子都快卖完了。

于是我赞赏到:"确实不错,代码很规范,可以的。"

他的眼神从开心,再到胜券在握,再到微微不屑。

脸上写满了两个字:"就这"?

仿佛主客场完全反转,下一秒就有可能拒掉我们的offer。

那一刻我决定,我要教他做事。

我顿了一顿:"那我们换个思路,我再拓展一个题目"

重新定义一个队列,并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

他的眼神从失落,再到迷惑不解,再到无可奈何。

我知道,真正的对线才刚刚开始。

为了显示我的人道主义,我提示到,今天先到这吧,咱俩加个微信,不用现在想,回头把代码发给我就行。

他舒了一口气,但是不知道我这样做的目的。

其实我的目的很简单,不想错过他这个候选人,更不想错过东坡肘子。

鱼和熊掌,我可兼得。

4

关注一下,交个朋友

最新文章

  1. Tween Animation---Scale渐变尺寸缩放动画
  2. KnockoutJS 3.X API 第七章 其他技术(5) 使用其他事件处理程序
  3. C# interface abstract class
  4. Python小爬虫练习
  5. 判断是苹果还是安卓app联调
  6. 如何激活一个window/dialog &amp;&amp; 不能直接对Dialog Box使用SetFocus
  7. 2013 ACM/ICPC Asia Regional Changsha Online&ndash;C (模拟)
  8. C#小写人民币转大写
  9. bzoj 1007 : [HNOI2008]水平可见直线 计算几何
  10. 【Android基础】点击Back键退出应用程序
  11. PHP 领域模型与数据库映射文章
  12. JS获取网站StatusCode,若存在写入文件
  13. 纯CSS3实现loading正在加载。。。
  14. 《java入门第一季》之面向对象(方法重写问题)
  15. 介绍一种很棒的wince 如何替换系统声音的方法
  16. 虚拟机Oracle VM VirtualBox linux系统如何访问windows共享文件夹
  17. (98)Wangdao.com_第三十天_拖拉事件
  18. pip安装软件或模块时提示cannot import name &#39;main&#39;
  19. Day09 -超级经典面试题:Ruby的a ||= b(or-equals)是什么意思呢?
  20. java常用集合浅层解析-面试必备

热门文章

  1. linux最初配置( vimrc设置 、tab键设置 inputrc、中文输入法等等)
  2. UML实战总结——机房收费系统UML第一版部分图展
  3. Flink-v1.12官方网站翻译-P022-Working with State
  4. HarmonyOS应用开发-Component体系介绍(一)
  5. shell脚本将字符串按指定分隔符切分成数组
  6. MySQL常用SQL语句2
  7. A - 最长回文(马拉车算法//manacher)
  8. CF-1451 E Bitwise Queries 异或 交互题
  9. 2018-2019 ACM-ICPC Brazil Subregional Programming Contest PART (10/13)
  10. Codeforces Round #655 (Div. 2) B. Omkar and Last Class of Math