大家好,我是吴师兄。
又到了面试的季节,在面试过程中,双方的情绪和互动往往会影响到整个过程的走向。
图片来源于宫水三叶
最近有一位求职者分享了他在字节的二面经历,由于面试官表现得似乎心不在焉,这位求职者情绪失控,直接对面试官说道:“
如果不想面试,可以不面
。”
事后,他非常懊悔,担心自己会因此被公司列入黑名单
。
那么,这种担忧是否真的合理?我们可以从多个角度来探讨这个问题。
首先,面试时保持冷静和专业是职场中的基本素养。
无论面试官表现如何,作为求职者,都应该尽力展现出良好的应对能力。
职场上的许多挑战都来自不确定性和压力,面试也是一种考察候选人应对压力的场景,从一个角度来说,面试也是可以拿工资的。
很多时候我们说"面试造火箭,工作打螺丝",虽然工作过程中经常摸鱼,似乎对不起给的高薪,但
实际上工资已经在面试环节兑现一部分了
,可以大胆摸鱼!
而且即便面试官看似不耐烦,也许是出于忙碌或其他原因,这并不一定意味着对候选人的否定。
候选人在这种情况下展现的情绪管理能力,往往是面试官评估的重要一环。
反之,直言表达不满可能会使自己陷入不利境地。
其次,关于“是否会被拉黑”的疑虑,其实不必过于担心。
在大型公司中,招聘流程通常是多层次、多维度的,单一面试官对整个流程的掌控权相对有限。
二面面试官通常是未来的直属领导,他们的评价对该岗位的决定有较大影响,但这不意味着整个公司都会因此对某位候选人关闭大门。即便这次的面试未能通过,也未必会影响未来在其他部门或职位的机会。
公司对于应聘者的评价往往是动态的,除非出现严重的不当行为,单次的面试表现不会对未来的求职道路产生致命影响
。
再者,拉黑机制在很多大公司确实存在,但通常只有 HR 部门或高层管理人员有权限对求职者做出永久性标记。
常见的“黑名单”多用于针对违反公司规章制度的行为,如考试作弊、提供虚假材料等。
在正常的面试场景下,候选人即使表现欠佳,通常也不会被标记为“不适合整个公司”。
这一点应当让求职者更加理性看待自己的表现,避免过度焦虑。
其实,反过来看,这次面试不成功或许并不是坏事
。
从职场体验的角度来说,求职者的未来发展很大程度上依赖于他和直属上级的相处。如果在面试阶段已经感受到强烈的不适,未来的合作很可能更加不顺畅。
一个不和谐的职场关系,不仅会影响到工作绩效,还可能成为职业生涯中的隐形障碍。因此,面试不过或许是一种“避险”机制——与其未来陷入更加复杂的人际矛盾,不如早些发现不适合的岗位。
总结来看,本次面试的表现虽然不尽人意,但不必过于自责。
面试是一个双向选择的过程,不仅是公司在选择你,你也在考量是否适合这家公司。未来的求职路还很长,一次面试的失误并不会决定全部职业前景。候选人应从这次经历中汲取教训,提升自己在类似情境下的应对能力,并以更加从容的姿态面对下一次挑战。
...
回归我们公众号的主题。
继续来一道和「大厂秋招」相关的算法原题。
2024 年的大厂真题可以在我的网站上进行练习。
网站地址:
https://oj.algomooc.com/
关注吴师兄,算法学习好轻松
题目描述
有一个荒岛,只有左右两个港口,只有一座桥连接这两个港口,现在有一群人需要从两个港口逃生,有的人往右逃生,有的往左逃生,如果两个人相遇,则 pk,体力值大的能够打赢体力值小的,体力值相同则同归于尽,赢的人才能继续往前逃生,并减少相应的体力
输入描述
系列非
0
整数,用空格隔开,
正数代表向右逃生,负数代表向左逃生
输出描述
最终能够逃生的人数
示例一
输入
5 10 8 -8 -5
输出
5 5
说明
8` 与 `-8` 相遇,同归于尽,`10` 遇到`-5`,打赢并减少五点体力,最终逃生的为`[5,5]`,均从右侧港口逃生,输出 `2
示例二
输入
5 6 -10
输出
1
解题思路
注意,本题和 LC735. 行星碰撞几 乎完全一致。唯一的区别在于,本题出现体力不相等的情况,需要进行减法操作而不是直接的吞并操作。
题意理解以及栈模拟思路的总框架
首先需要理解题意,题目中数字的的
正负性代表的含义
。正数表示向右移动,负数表示向左移动。
以示例一为例,可以用下图来表示
从上图可以看出,上述两个最先相遇的
8
和
-8
会
进行匹配,并且决出胜负结果
。
这个过程实际上和LC20. 有效的括号这类括号配对问题非常类似,只不过是从括号配对换成了
向左的数字和最近的向右数字进行匹配
。
可以
将向右的数字类比成左括号,向左的数字类比成右括号
,来进行数字匹配的思考。
很显然也应该考虑栈来完成本题目。整体的代码框架如下
stack = list()
# 遍历所有数字
for num in nums:
# 处理向右的数字
if num > 0:
pass
# 处理向左的数字
else:
pass
向右数字的处理
遇到向右的数字的时候,非常好处理,
直接入栈即可
。
因为遇到一个向右数字的时候,
即使栈中存在一些向左移动的人,他们是背向移动的,并不会出现匹配
。
譬如下图遍历到向右的
5
的时候,并不会跟前面的
-8
和
-5
发生匹配。
故整体的代码为
stack = list()
# 遍历所有数字
for num in nums:
# 当前逃生的人向右移动的情况
if num > 0:
# 无需考虑栈顶元素的方向或值,直接入栈即可
stack.append(num)
# 处理向左的数字
else:
pass
向左数字的处理
向左数字的处理,相对来说就比较复杂了。
如果在遍历过程中遇到一个向左的数字,那么我们可以分为以下几种情况来讨论:
-
-
-
对于前两种情况而言,也是无需发生匹配的,我们直接令这个向左的数字入栈即可。
但对于第三种情况,是需要进行数字的匹配,那么这个时候就需要进行栈顶向右数字的相关操作。
根据题意,这里可能会出现三种情况:
-
向左数字的绝对值
abs(num)
< 向右数字
stack[-1]
-
向左数字的绝对值
abs(num)
= 向右数字
stack[-1]
-
向左数字的绝对值
abs(num)
> 向右数字
stack[-1]
这里提到绝对值是因为向左数字在数值上必然是一个负数,使用绝对值来讨论是更加严谨的说明。
对于情况
1
,向左的人会倒下体力修改为
0
,而向右的人的体力会减去
abs(num)
,故对应代码为
if abs(num) -1]:
# 向右的人损失abs(num)点体力,但仍未倒下,无需出栈
# 此处使用stack[-1] -= abs(num)也可以
stack[-1] += num
# 当前向左的人倒下,修改num为0
num = 0
对于情况
2
,向左的人会倒下体力修改为
0
,而向右的人也倒下
可以直接令其出栈
,故对应代码为
# 当前向左的人和栈顶向右的人的体力相等,则两个人均倒下
if abs(num) == stack[-1]:
# 向右的人倒下,出栈
stack.pop()
# 当前向左的人倒下,修改num为0
num = 0
对于情况
3
,向左的人体力会减去
stack[-1]
,而向右的人倒下
可以直接令其出栈
,故对应代码为
# 当前向左的人的体力大于栈顶向右的人
if abs(num) > stack[-1]:
# 向右的人倒下,出栈
right = stack.pop()
# 当前向左的人损失right点体力
# 注意num是个负数,right是个正数,使用加法修改num
num += right
到这里我们发现一个有意思的问题,如果是情况
3
出现,这个向左的人的体力并没有降为
0
。
如果此时栈顶元素仍然是一个向右移动的人的话,仍然需要继续进行上述的判断。
因此,这里我们需要使用一个
while
循环来进行。
while
循环持续进行的条件有
3
个:
-
-
-
即对应的代码为
while len(stack) != 0 and stack[-1] > 0 and num != 0:
pass
while
循环中,需要加上上述
3
个条件语句,来
判断当前向左数字和栈顶向右数字的匹配情况
。
而在
while
循环结束之后,
num
仍然不一定降为
0
。
举个例子,
num
是一个向左移动且体力极其充沛的人(绝对值很大),大杀四方赢了所有栈顶元素中所有向右移动的人,那么
num
仍然不降为
0
。
在这种情况下,我们必须在
while
外面再加一个判断,若
num
不为
0
则可以入栈。
while len(stack) != 0 and stack[-1] > 0 and num != 0:
pass
# 如果若干经过pk后,num的体力仍不为0,则需要入栈
if num != 0:
stack.append(num)
将上述所有代码框架进行梳理,最终答案就呼之欲出了。
最后,大家可以思考一下最终答案栈中元素的构成会有什么样的特点。
A:栈中元素最终的构成,一定由两部分组成:【若干向左移动的人】+【若干向右移动的人】,这两部分的长度均可能为
0
。
代码
Python
# 关注吴师兄,算法学习好轻松
# 输入体力数组
nums = list(map(int, input().split()))
# 初始化一个栈,用于维护逃生过程中的人的体力
stack = list()
# 从左到右遍历逃生的人的体力
for num in nums:
# 当前逃生的人向右移动的情况
if num > 0:
# 无需考虑栈顶元素的方向或值,直接入栈即可
stack.append(num)
# 当前逃生的人向左移动的情况
else:
# 进行while循环,退出循环的条件为以下三个条件中的一个
# 1. 栈为空栈,即原栈中没有向左的人,经过pk后所有向右的人都倒下;
# 2. 栈顶元素向左,即原栈中包含若干向左的人,经过pk后所有向右的人都倒下;
# 3. num为0,即经过pk后该人倒下
while len(stack) != 0 and stack[-1] > 0 and num != 0:
# 当前向左的人和栈顶向右的人的体力相等,则两个人均倒下
if abs(num) == stack[-1]:
# 向右的人倒下,出栈
stack.pop()
# 当前向左的人倒下,修改num为0
num = 0
# 当前向左的人的体力大于栈顶向右的人
elif abs(num) > stack[-1]:
# 向右的人倒下,出栈
right = stack.pop()
# 当前向左的人损失right点体力
# 注意num是个负数,right是个正数,使用加法修改num
num += right
# 当前向左的人的体力小于栈顶向右的人
elif abs(num) -1]:
# 向右的人损失abs(num)点体力,但仍未倒下,无需出栈
# 此处使用stack[-1] -= abs(num)也可以
stack[-1] += num
# 当前向左的人倒下,修改num为0
num = 0
# 如果经过pk后,num的体力仍不为0,则需要入栈
if num != 0:
stack.append(num)
print(" ".join(str(num) for num in