无情面试官之包含min函数的栈

0

我是一个无情的面试官。

面人无数,挂人无数。

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

招新人,填旧坑。

1

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

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

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

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

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

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

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

最后一题,必是算法。

行业规则,我必遵从。

2

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

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

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

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

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

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

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

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

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

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

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

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

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

3

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

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

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

举个例子

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

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

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

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

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

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

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

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

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

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

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

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

我第二次弹出 主栈的数字6之后,辅助栈一起弹出,当前最小值依然为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

关注一下,交个朋友

关注一下,交个朋友

<think>好的,我现在需要帮助用户在Python中使用matplotlib绘制包含min函数函数图像。首先,用户的问题是关于如何生成带有min函数的图像,并提供示例代码。根据用户提供的引用内容,特别是引用[1]和[2],用户可能已经了解基本的matplotlib绘图步骤,但需要具体应用到min函数上。 首先,我需要确定用户所说的“min函数”具体指什么。通常,min函数可以指多个函数中的最小值,例如,对于多个函数,每个x取值时取最小的y值。比如,绘制y = min(f1(x), f2(x), ...)这样的函数图像。常见的例子可能是y = min(x, x²)或者类似的组合。 接下来,我需要回顾基本的matplotlib绘图步骤。根据引用[1]中的示例,步骤是准备x和y数据、创建画布、绘制图像并添加网格等。用户需要将这些步骤应用到min函数的情况中。 首先,生成x值。使用numpy的linspace函数生成一个范围,比如从-2到2,足够多的点可以让曲线更平滑。例如,x = np.linspace(-2, 2, 1000)。 然后,定义多个函数,比如f1(x)和f2(x),然后计算每个x对应的y值为这两个函数的最小值。例如,y = np.minimum(f1(x), f2(x))。这里需要注意numpy的逐元素操作,所以应该使用np.minimum而不是Python内置的min函数,因为后者处理数组时可能不会按元素逐个比较。 假设用户想绘制min(x, x²),那么可以定义f1 = x,f2 = x²,然后y = np.minimum(f1, f2)。然后,按照标准绘图流程:创建画布,绘制曲线,添加网格、标签、标题等,最后显示图像。 需要检查代码的正确性,比如是否正确导入库,numpy和matplotlib是否正确安装。此外,是否需要显示多个函数min函数的对比,可能需要用不同颜色或线型区分,方便用户理解。 另外,引用[3]提到颜色条和高斯噪声的例子,但这里可能不需要,但可以提醒用户如果需要更复杂的可视化,可以参考相关方法。 可能的疑问点:用户是否希望同时绘制原始函数min函数的结果?是否需要图例说明?是否需要调整坐标轴范围或样式? 根据用户提供的引用,示例代码的结构应该和引用[1]中的类似,所以需要确保代码结构正确,包括导入库、生成数据、绘图和显示。 总结步骤: 1. 导入必要的库(numpy和matplotlib.pyplot)。 2. 生成x轴数据。 3. 定义需要比较的函数,如f1和f2。 4. 计算每个x点对应的min值。 5. 创建画布,设置大小和dpi。 6. 绘制min函数的曲线,可能同时绘制原函数。 7. 添加网格、标签、标题、图例等。 8. 显示图像。 需要确保代码中的每个步骤正确,并添加注释说明,方便用户理解。例如,在引用[1]的代码中,他们用了plt.figure设置画布,然后plt.plot绘图,接着添加网格并显示。 可能的错误点:用户可能忘记导入numpy或matplotlib,或者错误地使用Python的min函数而不是numpy的逐元素比较。需要提醒用户使用np.minimum来处理数组。 此外,可能需要考虑不同的函数组合,用户可能希望自定义不同的函数,因此示例代码应具有可调整性,比如允许用户修改f1和f2的定义。 最后,生成相关问题,可能需要围绕如何绘制其他复合函数、如何处理多个函数的比较,或者如何优化图像样式等方面提问。</think>在Python中使用Matplotlib绘制包含`min`函数函数图像,可以通过以下步骤实现: --- ### **步骤说明** 1. **定义函数范围**:生成x轴的数值范围,并定义需要比较的多个函数。 2. **计算最小值**:使用`np.minimum`对多个函数逐点取最小值。 3. **绘图**:绘制原始函数和`min`函数的图像,并添加标签和样式。 --- ### **示例代码** ```python import matplotlib.pyplot as plt import numpy as np # 1. 生成x轴数据 x = np.linspace(-2, 2, 1000) # 2. 定义两个函数并计算最小值 f1 = x # 函数1: y = x f2 = x ** 2 # 函数2: y = x² y_min = np.minimum(f1, f2) # 逐点取最小值 # 3. 创建画布 plt.figure(figsize=(10, 6), dpi=100) # 4. 绘制图像 plt.plot(x, f1, label="$y = x$", linestyle="--", alpha=0.5) plt.plot(x, f2, label="$y = x^2$", linestyle="--", alpha=0.5) plt.plot(x, y_min, label="$y = \min(x, x^2)$", color="red", linewidth=2) # 5. 添加样式 plt.title("函数 $y = \min(x, x^2)$ 的图像") plt.xlabel("x轴") plt.ylabel("y轴") plt.grid(linestyle="--", alpha=0.5) plt.legend() plt.show() ``` --- ### **代码解释** - **`np.minimum`**:用于对两个数组逐元素取最小值。例如,当`x=0.5`时,`min(0.5, 0.25)=0.25`[^1]。 - **绘图对比**:用虚线绘制原始函数($y=x$和$y=x^2$),用红色实线突出`min`函数的结果。 - **图像样式**:通过`plt.grid`添加虚线网格,`alpha`参数控制透明度,使图像更清晰[^1][^2]。 --- ### **效果说明** - 生成的图像中,红色曲线会在`x < 0`时跟随$y = x$,在`0 < x < 1`时跟随$y = x^2$,在`x > 1`时重新跟随$y = x$。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值