Python技术迷

我们公司已经臭名昭著了,网上一搜全是负面评价,候选人放鸽子的概率快百分百了雹感管这可苦了我们做招聘的人了。

网友吐槽说,自己公司网上一搜,全是负面评价,候选人一看就跑,放鸽子概率快拉满。

你别说,这种公司也挺有本事,别家是花钱做雇主品牌,它是靠员工现身说法,把招牌砸得铛铛响。HR前脚刚把人约好,后脚人家一搜公司名,估计连消息都不想回了。

Image

评论区有人说,求职者现在也不傻,面试前先查口碑,避雷比投简历还认真。还有人补刀,说这不是招聘难,是公司前面作的孽,后面全让HR背了。

最惨的确实是做招聘的人。锅不是你们的,鸽子却是你们接的,天天打电话像在替公司还债。你说这活干久了,谁还分得清自己是在招人,还是在给一家破口碑公司擦屁股。

算法题:有效数字

字符串一上来就 trim,再一路 if else 往下怼,这题大概率会把自己写乱。

“有效数字”这题烦的地方,不是规则多,是规则互相咬。 小数点能出现,e 也能出现,正负号还不止一个位置能放。你要是靠“看着像”去判断,最后一定会漏 case。

我一般不先写正则,先把规则拆干净:

  • 数字一定要出现,不能全是符号和点。
  • e / E 最多一个,而且前后都得是合法数字段。
  • 正负号只能出现在开头,或者 e/E 后面第一位。
  • 小数点只能出现在指数前面。
  • 指数后面不能再出现小数点。

这题最稳的写法,其实就是扫一遍字符串,边扫边记状态。

先看代码,别急着解释:

classSolution:
defisNumber(self, s: str) -> bool:
        s = s.strip()
ifnot s:
returnFalse

        seen_digit = False# 是否见过数字
        seen_dot = False# 是否见过小数点
        seen_exp = False# 是否见过 e / E
        digit_after_exp = True# e 后面是否有数字,默认 True 是为了兼容没出现 e 的情况

for i, ch in enumerate(s):
if ch.isdigit():
                seen_digit = True
if seen_exp:
                    digit_after_exp = True

elif ch in"+-":
if i > 0and s[i - 1] notin"eE":
returnFalse

elif ch == ".":
if seen_dot or seen_exp:
returnFalse
                seen_dot = True

elif ch in"eE":
if seen_exp ornot seen_digit:
returnFalse
                seen_exp = True
                digit_after_exp = False

else:
returnFalse

return seen_digit and digit_after_exp

这段代码看着没花活,但排查顺序是对的。 我写这类题,第一眼先盯 e,因为它最容易把前后两段逻辑搅在一起。

比如这几组:

cases = ["2", "0089", "-0.1", "+3.14", "4.", "-.9",
"2e10", "-90E3", "3e+7", "+6e-1",
"abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3"]

sol = Solution()
for x in cases:
    print(x, "=>", sol.isNumber(x))

像 4. 算合法,很多人会误杀。 因为小数点后面可以没有数字,但前面得有。 再比如 -.9 也合法,说明正负号后面不一定直接跟数字,也可能先跟点。

反过来,1e、e3、99e2.5 这种就别犹豫,直接判错。尤其 99e2.5,前半段像数字没用,指数部分必须是整数,这里很容易手软。

这题说到底,不是数学题,是字符串状态控制题。 谁一上来就想“一把梭哈全覆盖”,谁大概率调半天。 老老实实扫一遍,把 数字 / 点 / 符号 / 指数 这四类字符的位置关系捋顺,反而最省事。