Python技术迷

最近招了个28岁技术,房贷150万,独生子,孩子刚出生,媳妇没工作~

刚刷到个帖子,说公司新招了个28岁的程序员,房贷150万,独生子,娃刚出生,老婆还没工作。老板私下还夸他“优质员工”,说技术牛还跑不了。😂

Image

我觉得吧,这事儿其实挺典型。程序员最怕啥?怕生活一身枷锁,经济压力大到想跑路都没门。老板就盯着这点——知道你上有老下有小,还得还房贷,所以再卷也只能咬牙干。网友们有的觉得老板太精明,也有人同情这哥们。说白了,谁不是身上绑着点啥才进公司卖命?

换个角度想,技术牛确实是优势,但千万别让“软肋”变成老板手里的刀。职场就是性价比,老板看你能榨多少,你得看能不能多拿点。总之,生活不易,但咱技术人要学会让自己始终有谈判的底气,别被困住了。【备注:文末可领最新资料】

面试题:安排邮筒

这题意思就是:有一条直线,有些房子,每个房子在不同的位置,你要装k个邮筒,把所有房子都服务到,每个房子只能投递到最近的邮筒。你要把所有房子到最近邮筒的距离之和弄到最小。说白了,这就是个经典区间最优划分问题嘛。

其实这种题以前刷LeetCode都见过,啥“分邮筒”“分书包”其实一类,背后套路就是动态规划,没啥好说的。

我那天晚上十一点多还在公司楼下抽烟,脑子里就琢磨这个事。小杨还问我要不要写暴力搜索,我直接一口拒绝。兄弟,暴力你写写看,房子数量一多,直接超时,他面试肯定挂。

你想啊,邮筒要装在哪,肯定不是随便装。一个邮筒负责一段连续的房子,邮筒应该装在这些房子的中位数位置,这样总距离最短。举个例子,你三个房子在1、2、100,你只能装一个邮筒,你肯定装在2那里,比装在1和100都合适嘛。

所以题目里,最暴力的方式就是每种划分你都算一遍,但动态规划肯定更优。DP的思路其实挺套路的,dp[i][k] 表示前i个房子用k个邮筒的最小总代价。

具体转移就是: dp[i][k] = min(dp[j][k-1] + cost(j+1, i)) 就是枚举第k个邮筒负责j+1到i这些房子,然后前面k-1个邮筒管j个房子,这样分出来每段都搞个中位数求代价。

cost(j+1, i)这个怎么算?直接取区间中位数,所有房子到它的距离加一遍。

其实算cost的时候,一开始我也想复杂了,后来发现排序+前缀和一遍全解决,别想太多。

你要是真上手撸,我觉得python写着最省心。 晚上写代码还被我媳妇喊去洗碗,回来手湿乎乎的敲了半天键盘,给你参考下,别笑我变量名瞎写的:

defminDistance(houses, k):
    houses.sort()
    n = len(houses)
# 预处理cost,cost[i][j]表示i到j这段一个邮筒的最小总代价
    cost = [[0]*n for _ in range(n)]
for i in range(n):
for j in range(i, n):
            mid = houses[(i+j)//2]
for l in range(i, j+1):
                cost[i][j] += abs(houses[l] - mid)
# dp初始化
    dp = [[float('inf')] * (k+1) for _ in range(n+1)]
    dp[0][0] = 0
for i in range(1, n+1):
for m in range(1, min(i, k)+1):
for j in range(i):
if dp[j][m-1] != float('inf'):
                    dp[i][m] = min(dp[i][m], dp[j][m-1] + cost[j][i-1])
return dp[n][k]

你看,这里代码其实没啥玄学。重点是cost数组提前预处理好,别每次算都O(n)扫一遍,要不你面试肯定TLE。dp那一坨套三层for,实战时你看房子数量,不大就直接莽,面试官要问优化你再说优化嘛。

说个真事,之前有同事面试被问这题,脑子一热,直接背了个数学公式往里套,最后被怼懵了。其实只要理清楚“邮筒装在中位数最优”,剩下就动态规划无脑推。

对了,我写到一半还被猫挠了一下腿...一边撸猫一边敲代码,突然又想起这题其实和K线段最小分割、画画斜率优化都有点像,但面试的时候讲多了只会被当成炫技,老老实实说动态规划,人家更愿意听。

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领