堂哥 40.5岁,今年被裁员了,赔偿金54.6万,被裁后他找了半年的工作,都嫌弃他年龄大,工资比以前少大半不够养家。他问我咋办
刚看到个贴子,说网友吐槽:堂哥40多,今年被裁,拿了54.6万赔偿,结果找了半年工作,不是嫌他年龄大,就是给的工资只有以前一半,压根不够养家,他问“我咋办?”
网友回帖我看了看,有说干脆躺平慢慢花钱的,有怪大环境不行的,也有劝他去送外卖、跑网约车先顶上的。
我觉得这事吧,先别把54.6万当“横财”,那就是未来两三年的“命”。一部分锁死当家庭安全垫,剩下的是“买时间”的钱,用来降薪换岗、学点新技能、试试别的赛道,而不是撑面子硬等同水平的岗位。
换个角度想,这个年纪最怕的不是降薪,而是不动。先接一份现金流稳定的工作,把家庭稳住,再慢慢谋后路。
面试题:苹果和桔子
昨天晚上快十一点了,我在小区门口水果店排队,排我前面那哥们掏出手机算半天: “老板,苹果 6 块一斤,桔子 4 块一斤,我兜里就 30 块,怎么买划算啊?我要多买点水果回去给娃吃,又不能超预算。”
我站后面一看,这不就是个活生生的算法题嘛,对吧。干脆用这个场景讲一讲“苹果和桔子”这个小算法,用 Python 写一遍,其实挺接地气的。
想象一下题目是这样的:
你有 money 块钱,苹果单价 pa,桔子单价 po,要求是在不超预算的前提下,把买到的水果总个数(苹果数 + 桔子数)尽量搞到最大。顺带把怎么买也算出来,比如买几个苹果几个桔子。
你直觉可能会说:那我肯定买便宜的啊,对吧,桔子便宜就全买桔子。 但你稍微想一下就知道不一定,比如:
苹果 5 块,桔子 3 块,总钱是 11。 只买桔子:11 / 3 = 3 个桔子,剩 2 块废掉,总共 3 个水果。 要是买 1 个苹果(5 块),剩 6 块刚好买 2 个桔子,一共 3 个水果,其实跟全买桔子一样多。
再换一组价格,有时候“掺点苹果”反而更好。所以纯靠眼睛蒙选,很容易选错,这就是算法要干的事:穷举所有合理的买法,找一个最优的。
怎么暴力穷举呢?思路特别土但好用:
先假设买 a个苹果,a从 0 个买到“把钱全部花在苹果上”的最大值。对于每个 a,算一下剩下多少钱还能买几个桔子。每一组 (a, b)(a个苹果,b个桔子)都算下总数a + b,留一个最大的。
用数学写一下就是:
0 <= a <= money // pab = (money - a * pa) // po记录最大 a + b的那组(a, b)
复杂度咋样? 最多循环 money // pa 次,钱不大的时候完全够用,比如 1e5 以内都一点问题没有。再抠门一点,可以让外层循环用更贵的水果,这样次数还会更少一点,不过先不折腾,先写个最直白的。
用 Python 写出来就是这个味道:
defmax_fruits(money: int, pa: int, po: int):
"""
money: 总预算
pa: 苹果单价
po: 桔子单价
返回: (最多能买的水果总数, 苹果个数, 桔子个数)
"""
best_total = 0
best_a = 0
best_o = 0
# 遍历可能买的苹果个数
max_apples = money // pa
for a in range(max_apples + 1):
remain = money - a * pa
if remain < 0:
# 理论上不会进来,这里只是习惯性防御
continue
# 剩下的钱全部用来买桔子
o = remain // po
total = a + o
if total > best_total:
best_total = total
best_a = a
best_o = o
return best_total, best_a, best_o
if __name__ == "__main__":
# 简单交互一下,你也可以改成读输入
money = int(input("请输入总预算 money: "))
pa = int(input("请输入苹果单价 pa: "))
po = int(input("请输入桔子单价 po: "))
total, a, o = max_fruits(money, pa, po)
print(f"最多可以买 {total} 个水果,其中苹果 {a} 个,桔子 {o} 个。")
你看代码也不复杂,大概就这么几个点:
那函数一开始先把当前最优解设成 0 个水果,苹果和桔子也都是 0。后面每试一组就和当前最优比一下,好的就替换掉,这就是典型的“枚举 + 维护最优值”的套路,以后做别的题也特别常见。
有几个小细节顺手说一下:
money // pa用的是整除,这样保证买苹果不会超预算。每次算剩余的钱 remain,再对桔子的单价整除,同样也不会超预算。如果你希望“既要苹果又要桔子”,可以在判断的时候多加个约束,比如要求 a > 0且o > 0再参与比较就行。
比如你在命令行跑一下,输入:
money = 30 pa = 6 po = 4
程序会把所有可能的苹果个数都过一遍:0 个苹果、1 个苹果、2 个苹果……直到只够买苹果不够买更多为止,然后自动帮你挑出水果最多的那种搭配。比你站在水果摊前掰指头算靠谱多了。
这个小问题看起来像是生活算账,其实后面那套套路放大一点,就是很多算法题的原型:有个上限约束(预算),有几类东西(苹果、桔子),你想选一个“最优”的组合。先从这种两种水果的简单版写顺手了,再去看“背包问题”那种大兄弟,就不那么恐怖了。
行了,先这样,你可以自己随便改改题目数据试试,看看程序输出是不是符合你直觉,不对的话再一起抠细节也行。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB