最近看到一个帖子,直接把我给看笑了。有网友爆料,笔试能作弊,面试也能“操作”,甚至还有人热心传授心得,来了一句:“真没必要自己做!”这话直接把原帖主气到崩溃。网友评论更绝:“简历是假的,笔试是假的,面试是假的,但 offer 是真的。我这边,简历是真的,笔试是真的,面试是真的,所以邮箱是空的。”太扎心了,懂得都懂。😂
听完这事真的满脑子问号:现在面试还能“外挂”了?想想自己当初为了一次面试,刷 LeetCode 刷到怀疑人生,调代码调到凌晨两点,为的就是给面试官展示“真实实力”。结果人家?直接一套“作弊组合拳”,轻轻松松抱回大厂 offer。说实话,这事儿真的让人心态不平衡。但转念一想,靠假简历、假笔试混进去的人,工作中迟早要露馅儿啊。程序员这行能不能干得下去,实力摆在那儿,PPT 做得再漂亮,代码跑不通,迟早得吃瘪。你们对这种事怎么看?是觉得作弊拿到 offer 算“高手”?算法题:分发糖果
今天跟大家聊一个算法题:分发糖果。这是一个挺经典的面试题,考的是逻辑和贪心算法(对,就是那个听着挺“贪”的算法😂)。问题是这样的:有一群小朋友站成一排,每个小朋友都有一个评分。老师要按照以下规则给他们发糖果:
老师的预算显然有限,我们得帮她用最少的糖果满足这些规则。咋整?🤔分析一下问题
看到这个题,我第一反应是——好家伙,这就是标准的贪心算法场景啊!因为每个孩子的糖果分配只跟相邻的孩子有关系,所以可以通过两遍遍历来搞定问题。解题思路
我们先来搞明白要怎么分糖果才能既满足条件,又尽量少浪费糖:- 从左往右遍历:保证每个孩子比左边评分低的拿的糖少。
- 从右往左遍历:保证每个孩子比右边评分低的拿的糖少。
两遍下来,每个孩子的糖果数就是满足规则的最少数量。代码实现
为了直观一点,我给大家撸段Python代码,稍微带点注释,顺便吐槽一下自己写代码时的脑回路😂。def candy(ratings):
n = len(ratings)
candies = [1] * n # 初始化,每人至少有一个糖果
# 从左往右,保证每个孩子比左边分高时多拿糖
for i in range(1, n):
if ratings[i] > ratings[i - 1]:
candies[i] = candies[i - 1] + 1
# 从右往左,保证每个孩子比右边分高时多拿糖
for i in range(n - 2, -1, -1):
if ratings[i] > ratings[i + 1]:
candies[i] = max(candies[i], candies[i + 1] + 1) # 取最大值以满足两个条件
return sum(candies) # 总糖果数
看看运行效果
ratings = [1, 0, 2]
print(candy(ratings)) # 输出:5
咋算的?先初始化每人一个糖果:[1, 1, 1]。最后总共是 2 + 1 + 2 = 5
颗糖果。完美!贪心算法的“贪”
其实,贪心算法的核心思想就是每次只考虑局部最优解。比如在这题里,先从左往右“贪”一遍,再从右往左“补”一遍,两次贪心一结合,全球问题就解决了!其实这题看着不难,但细节真不少。比如你一开始可能觉得初始化糖果数是0,但别忘了规则要求每人至少一颗糖,这一点马虎不得啊!还有个坑点是第二遍遍历的时候,得用 max
来处理冲突,否则可能会不符合规则。算法题就是这样,看着简单,稍不注意就GG了。对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。