无情面试官之包含min函数的栈
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
关注一下,交个朋友
无情面试官之包含min函数的栈的更多相关文章
- 面试经典-设计包含min函数的栈
问题:设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素. 要求函数min.push以及pop的时间复杂度都是O(1). 解答:push 和pop的时间复杂度 ...
- 剑指Offer面试题:19.包含Min函数的栈
一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...
- 【编程题目】设计包含 min 函数的栈
2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的 ...
- 【面试题021】包含min函数的栈
[面试题021]包含min函数的栈 MinStack.cpp: 1234567891011121314151617181920212223242526272829303132333435363738 ...
- 包含min函数的栈 ,二叉树的镜像
包含min函数的栈 问题 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 代码 # -*- coding:utf-8 -*- class Sol ...
- 算法: 包含min函数的栈
* @Description 包含min函数的栈* @问题:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).* @思路: 1:Stack 类中的p ...
- 《剑指offer》 包含min函数的栈
本题来自<剑指offer> 包含min函数的栈 题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 思路: 举例子让抽象问题具体 ...
- 41. 包含min函数的栈
包含min函数的栈 描述 设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 ...
- 《剑指offer》第三十题(包含min函数的栈)
// 面试题30:包含min函数的栈 // 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min // 函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). #i ...
随机推荐
- Nacos服务心跳和健康检查源码介绍
服务心跳 Nacos Client会维护一个定时任务通过持续调用服务端的接口更新心跳时间,保证自己处于存活状态,防止服务端将服务剔除,Nacos默认5秒向服务端发送一次,通过请求服务端接口/insta ...
- 闲聊CAP、BASE与XA
CAP理论与BASE理论 首先要和大家说的就是大名鼎鼎的CAP理论与BASE理论了,这两个理论与解决分布式事务问题是密切相关的. 其实网上有很多关于CAP与BASE相关的文章,一写就写了一大堆,篇幅很 ...
- E - Period(KMP中next数组的运用)
一个带有 n 个字符的字符串 s ,要求找出 s 的前缀中具有循环结构的字符子串,也就是要输出具有循环结构的前缀的最后一个数下标与其对应最大循环次数.(次数要求至少为2) For each prefi ...
- 2019牛客暑期多校训练营(第一场)I Points Division(dp+线段树优化)
给你n个点,第i个点在的位置为(xi,yi),有两个属性值(ai,bi).现在让你把这n个点划分为A和B两个部分,使得最后不存在i∈A和j∈B,使得xi>=xj且yi<=yj.然后对于所有 ...
- 迪杰斯特拉+拆点 Deliver the Cake - HDU 6805
题意: t组输入,给你n个点m条边.你需要输出从s点到t点的最短距离,然后是m条边,每条边输入信息为: a,b,c 表示从a点到b点的一个无向边长度为c 每一个点会有一个属性L.R或M 如果a和b一个 ...
- Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)
题意:给你一个长度为\(3*n\)的字符串,要求修改最少的次数,使得字符串中\(0,1,2\)的个数相同,并且在最少次数的情况下使字典序最小. 题解:贪心,\(0\)一定放在前面,\(1\)和\(2\ ...
- k8s二进制部署 - traefik安装
配置traefik资源清单rbac.yaml 配置traefik资源清单 rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: name: t ...
- Operating System:操作系统启动总结
现代操作系统的启动引导过程会有所差异,本文仅针对Intel x86系列作讲解,了解原理即可. 系统引导过程总体介绍 系统引导过程主要由以下几个步骤组成(以硬盘启动为例)1.开机:2.BIOS加电自检( ...
- 使用SignTool对软件安装包进行数字签名(一)--制作证书
一.制作根证书 1.开始菜单-运行-输入cmd,弹出命令行窗体. 2.输入命令:cd /d F:\SignTool,将当前工作目录修改到SignTool路径下. 3.使用makecert命令制作证书, ...
- 7.Topic交换机之模拟文件分类
标题 : 7.Topic交换机之模拟文件分类 目录 : RabbitMQ 序号 : 7 Password = "123456", AutomaticRecoveryEnabled ...