大厂员工自爆:去年在大厂,年薪95万,女朋友父母爱答不理,今年上岸国家电网,人不到,叔叔阿姨吃饭都不让动筷子
刚看到个贴子,说一哥们去年在大厂年薪95万,去女友家叔叔阿姨爱答不理;今年上岸国家电网,人还没到,饭桌都不让他动筷子。
网友回复两极分化,一边骂女方父母现实势利,一边感叹“体制内真香”。
我觉得这事吧,说到底是价值观问题。有人看重钱,有人看重稳定,还有人只认体制招牌,你很难要求别人用你的标准来判断“好对象”。但被这样区别对待,其实也是种提醒:谈的是恋爱,打交道的是整个家庭。
如果对方父母眼里只有编制、牌子,没有对人的基本尊重,那以后不管你在不在体制内,迟早还会因为别的事翻旧账。
面试题:相对名次
昨天晚上快十一点,我在公司楼下便利店排队买牛奶,我们组那个小李突然在群里丢过来一句: “东哥,那个…给一堆分数叫你算什么相对名次,你咋写?” 我手机一看,这不就是典型的算法小题嘛,用 Python 写两行就能搞定的那种,但里面其实有几个小细节,说一下就清楚多了。
先把题目用人话说一下: 有一组选手的分数,比如 [10, 3, 8, 9, 4],分数高的人名次靠前。 要求你返回一个「字符串数组」,对应每个选手的名次,但有个小规则:
最高分是 "Gold Medal"第二 "Silver Medal"第三 "Bronze Medal"从第四名开始,就是正常名次数字,比如 "4","5"这样
注意一个点:返回的顺序还是原数组的顺序,不是排好名次的顺序,这也是这题唯一容易搞混的地方。
那我们脑子里先过一遍「暴力」想法啊: 如果对每个人,都去数一遍“有多少人比 TA 分高”,那一个人要扫一遍数组,n 个人就要扫 n 次,时间复杂度 O(n^2),数据一大就不行了。 这种想法写出来也不是不行,但面试官多半会皱眉头。
更自然的思路是: 我先把大家的分数按从高到低排个序,排出来就是名次。 问题是排序之后就看不到“这个人原来在第几个位置”了,所以我们得把「下标」也一起带着。 在 Python 里这个很好弄,直接 enumerate(scores),每一项变成 (原下标, 分数),然后按分数从大到小排。
用代码写一下这个思路,大概长这样:
from typing import List
deffindRelativeRanks(score: List[int]) -> List[str]:
# 1. 把原来的下标记下来
# pairs 里每一项是 (分数, 原下标)
pairs = [(s, i) for i, s in enumerate(score)]
# 2. 按分数从高到低排序
pairs.sort(key=lambda x: x[0], reverse=True)
n = len(score)
res = [""] * n # 最终答案,先占个位
# 3. 依次给排序后的选手分配名次
for rank, (s, idx) in enumerate(pairs, start=1):
if rank == 1:
res[idx] = "Gold Medal"
elif rank == 2:
res[idx] = "Silver Medal"
elif rank == 3:
res[idx] = "Bronze Medal"
else:
res[idx] = str(rank)
return res
你看整个逻辑其实就三步: 记下标 → 排序 → 回填名次。 时间复杂度是排序的那一步 O(n log n),空间复杂度额外用了一个 pairs 和结果数组,算 O(n),很正常。
说几个容易翻车的小点哈:
下标别搞丢如果你只写
sorted(score, reverse=True),那之后就不知道“谁是谁了”,没办法跟原位置对应,这就是为什么要enumerate。返回的是字符串第四名以后记得用
str(rank)转一下类型,不然有些语言会报错。Python 倒是很宽容,但题目要求是字符串,还是老老实实转一下。只改前三名的文案有同学一激动搞个数组
["Gold Medal", "Silver Medal", "Bronze Medal"],然后各种 if/else 写乱了。 其实上面那种if rank == 1/2/3的写法就挺清楚的,看一眼就懂。
如果你想再骚一点,还可以把那三个奖牌放到一个小数组里,稍微改写下:
deffindRelativeRanks(score: List[int]) -> List[str]:
medals = ["Gold Medal", "Silver Medal", "Bronze Medal"]
pairs = [(s, i) for i, s in enumerate(score)]
pairs.sort(key=lambda x: x[0], reverse=True)
res = [""] * len(score)
for rank, (s, idx) in enumerate(pairs, start=1):
if rank <= 3:
res[idx] = medals[rank - 1]
else:
res[idx] = str(rank)
return res
这个版本逻辑一样,就是把前三名的文案抽出来,代码稍微紧凑一点,看你喜欢哪个风格。
再顺手提一句边界情况:
空数组:直接返回空数组就行,代码本身也能自然跑过。 只有一两个人:那就只有金牌、银牌,甚至只有一个金牌,也完全没问题。排序之后最多就走一两次循环。
像这种「先排序再回填到原位置」的套路,在算法题里挺常见的。 只要你看到“结果要按原顺序返回,但排名或顺序依赖于整体比较”这种描述,就可以下意识想想: “我要不要先把下标记上,然后排序,再映射回去?”
差不多就这些,小李当时听完之后说了一句:“哦,原来就这啊。” 我说你别嫌简单,这种小题写得又快又稳,面试里反而是最加分的那种。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB