38岁的总监,某大厂P9,被裁了。现在在卖保险~
我在网上看到个帖子,味儿一下就上来了:38岁,某大厂P9,总监级别,去年刚被裁,今年已经去卖保险了,而且上来第一个月就冲进了MDRT。你说离谱吧,又挺现实。
有网友说,真正厉害的人,换个赛道照样能打。也有人吐槽,大厂头衔一摘,最后还是得自己找饭吃。听着扎心,可这话真不算错。
以前总觉得做到总监,工牌都快焊身上了,结果公司一动刀,谁都得往外走。可话又说回来,这哥们转头去卖保险,还能第一个月干出成绩,说明人家卖的从来不是保险,是认知、人脉和信任。
说白了,职场混到后面,拼的真不是工位和title,是你离开公司之后,还值多少钱。
算法题:有效的完全平方数
这题名字叫 有效的完全平方数,题面不复杂:给你一个正整数 num,不要用 sqrt 这类库函数,判断它是不是完全平方数。
刚看到这题,很多人第一反应是从 1, 2, 3... 一路试到 i * i == num。这么写能过一部分小数据,但数一大就慢了。比如 num = 2147395600,你真从 1 开始乘,过程就有点笨了。
这题其实挺适合用二分。原因很直接,平方值是单调递增的:
defis_perfect_square(num: int) -> bool:
if num < 1:
returnFalse
left, right = 1, num
while left <= right:
mid = (left + right) // 2
square = mid * mid
if square == num:
returnTrue
if square < num:
left = mid + 1
else:
right = mid - 1
returnFalse
这段代码核心就两步: 先猜一个中间值 mid,再看 mid * mid 和 num 的大小关系。小了就往右收,大了就往左收。整个过程不是一个个试,而是不断砍掉一半区间。
拿 num = 16 走一下就很清楚:
# left = 1, right = 16
# mid = 8, 8*8 = 64,太大,right = 7
# mid = 4, 4*4 = 16,命中
这种写法时间复杂度是 O(log n),比顺序试探稳定得多。
当然,这题还有个挺有意思的做法:利用“连续奇数之和”。因为:
1 = 1 4 = 1 + 3 9 = 1 + 3 + 5 16 = 1 + 3 + 5 + 7
也就是说,一个完全平方数,一定可以表示成前若干个连续奇数的和。
代码可以这么写:
defis_perfect_square_v2(num: int) -> bool:
odd = 1
while num > 0:
num -= odd
odd += 2
return num == 0
比如 16:
# 16 - 1 = 15
# 15 - 3 = 12
# 12 - 5 = 7
# 7 - 7 = 0
最后正好减到 0,说明它是完全平方数。
这题表面是在判断平方数,实际考的还是两件事: 一是你能不能看出“有序范围里找答案”;二是代码边界别写飘了,比如 left <= right、mid * mid 的比较这些地方,最好一次写准。
题不大,但很适合拿来练二分的手感。