专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
四川日报  ·  网传湖南一大桥开裂,通报来了→ ·  昨天  
康石石  ·  拿到藤校奖学金的作品集长什么样? ·  昨天  
自贡网  ·  一图速览|2025年自贡市政府工作报告 ·  2 天前  
51好读  ›  专栏  ›  吴师兄学算法

字节面试怼了面试官,会被封杀吗?

吴师兄学算法  · 公众号  ·  · 2024-09-30 10:30

正文

大家好,我是吴师兄。

又到了面试的季节,在面试过程中,双方的情绪和互动往往会影响到整个过程的走向。

图片来源于宫水三叶

最近有一位求职者分享了他在字节的二面经历,由于面试官表现得似乎心不在焉,这位求职者情绪失控,直接对面试官说道:“ 如果不想面试,可以不面 。”

事后,他非常懊悔,担心自己会因此被公司列入黑名单

那么,这种担忧是否真的合理?我们可以从多个角度来探讨这个问题。

首先,面试时保持冷静和专业是职场中的基本素养。

无论面试官表现如何,作为求职者,都应该尽力展现出良好的应对能力。

职场上的许多挑战都来自不确定性和压力,面试也是一种考察候选人应对压力的场景,从一个角度来说,面试也是可以拿工资的。

很多时候我们说"面试造火箭,工作打螺丝",虽然工作过程中经常摸鱼,似乎对不起给的高薪,但 实际上工资已经在面试环节兑现一部分了 ,可以大胆摸鱼!

而且即便面试官看似不耐烦,也许是出于忙碌或其他原因,这并不一定意味着对候选人的否定。

候选人在这种情况下展现的情绪管理能力,往往是面试官评估的重要一环。

反之,直言表达不满可能会使自己陷入不利境地。

其次,关于“是否会被拉黑”的疑虑,其实不必过于担心。

在大型公司中,招聘流程通常是多层次、多维度的,单一面试官对整个流程的掌控权相对有限。

二面面试官通常是未来的直属领导,他们的评价对该岗位的决定有较大影响,但这不意味着整个公司都会因此对某位候选人关闭大门。即便这次的面试未能通过,也未必会影响未来在其他部门或职位的机会。

公司对于应聘者的评价往往是动态的,除非出现严重的不当行为,单次的面试表现不会对未来的求职道路产生致命影响

再者,拉黑机制在很多大公司确实存在,但通常只有 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

向左数字的处理

向左数字的处理,相对来说就比较复杂了。

如果在遍历过程中遇到一个向左的数字,那么我们可以分为以下几种情况来讨论:

  1. 栈中没有元素
  2. 栈顶元素是向左的数字
  3. 栈顶元素是向右的数字

对于前两种情况而言,也是无需发生匹配的,我们直接令这个向左的数字入栈即可。

但对于第三种情况,是需要进行数字的匹配,那么这个时候就需要进行栈顶向右数字的相关操作。

根据题意,这里可能会出现三种情况:

  1. 向左数字的绝对值 abs(num) < 向右数字 stack[-1]
  2. 向左数字的绝对值 abs(num) = 向右数字 stack[-1]
  3. 向左数字的绝对值 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 个:

  1. 栈不为空
  2. 栈顶元素向右
  3. 当前向左的人体力没有降到 0

即对应的代码为

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






请到「今天看啥」查看全文