我嘞个去,在BOSS上调戏HR,疯了。。
刚刷到个帖子,有人说在BOSS上调戏HR,感觉已经找工作找到疯魔状态了😂。
我觉得这事吧,归根到底还是现在大环境太卷了。很多网友吐槽说,调侃HR只是给枯燥的求职增添点乐趣。确实,发一堆简历没人回,那种挫败感有时候比生产环境出Bug还让人郁闷。大家开开玩笑,互相吐槽下,也算给自己减压。
不过话说回来,找工作就像刷副本,HR是BOSS,但咱们也别太消极,把精力花在提升自己“输出”,能多拿一两个offer,心态自然好起来了。【备注:文末可领最新资料】
面试题:目标和
快下班了结果群里突然有人甩来一道算法题,搞得我那会儿本来打算去楼下买瓶雪碧的,结果在工位上一坐又坐了一个多小时。就是那个“目标和”——你们知道吧,就是那个,给你一个整数数组 nums,还有一个目标值 target,让你给数组里每个元素随便加个正负号,最后能不能凑出来 target,那种题。
有点像啥呢,就是你手里一堆数字卡片,随便正着贴还是反着贴,问你能不能“贴出”某个和。我们组那个小李说,这不就暴力呗,递归一遍全试试。我说你这样面试官绝对给你挂电话啊,复杂度直接2的n次方,人家肯定不乐意。
然后你们看啊,我那会儿脑袋还晕着,刚泡完方便面——想了一下,其实这个题,和背包问题还挺像的,你们发现没?就是那种,能不能凑出某个数,跟装背包差不多。只不过这次正负都能选,等于说你其实是把数组一分为二,一堆正一堆负,让正的和减去负的和等于 target。换句话说,所有数的总和是 sum,你让一部分带正号一部分带负号,最后 sum1 - sum2 = target,然后 sum1 + sum2 = sum,所以推一下 sum1 = (sum + target) // 2。你们看,是不是有点味道了?
不过那个除以2,要整除才行,不然没戏。所以我说,如果 sum + target 是奇数,或者 target 比 sum 还大,直接返回 0,不用想。
后面就直接用动态规划嘛,那个 dp[i][j] 表示前i个数字,能不能凑出j。其实用个一维的 dp 就行,因为每次只用到前一行。你们是不是看代码容易点?我那天顺手写了一个,就酱:
deffindTargetSumWays(nums, target):
s = sum(nums)
if abs(target) > s or (s + target) % 2 == 1:
return0
bag = (s + target) // 2
dp = [0] * (bag + 1)
dp[0] = 1
for num in nums:
for j in range(bag, num - 1, -1):
dp[j] += dp[j - num]
return dp[bag]
其实这个 dp 跟0-1背包一个意思,就是每个数字你选或者不选,能有几种方案让总和正好等于 bag,最后那个 dp[bag] 就是答案。
反正我那天写完发过去,面试官说一句“思路清晰”,然后也没下文了...不过说真的,这类题关键不是能不能写出来暴力递归,面试主要看你能不能转成 dp,能不能优化空间啥的。
还有啊,实话说我每次写这类题,脑子里第一反应都是画图,就是把数字往左右分,像天平一样,左边挂点右边挂点,看怎么能平衡,特别形象。
对了,补一句,如果数组里有0,那其实 0 选正还是负都不影响 sum,但是方案数要乘2,因为 0 有两种取法。这个坑面试也挺爱问,别说我没提醒你们哈。
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领