Python技术迷

公司裁员不给20W赔偿,37岁同事硬生生耗了8个月,按时打卡、领2.6万月薪,拒绝字节4万offer。继续待着真的值吗?

37岁了,被公司盯上裁员,赔偿没谈拢,人家直接不走了。每天照常打卡,照常拿2.6万,硬生生耗了8个月。中间还有字节4万的offer,都没接。很多人一听先笑:这哥们是不是耗上头了?我反而觉得,这才叫把职场规则玩明白了。

Image

你以为他是在“赖着不走”,其实人家是在等公司为自己的决定买单。公司想低价清人,员工凭啥配合演懂事?有网友说,8个月都快21万了,早把赔偿耗出来了。还有人说,37岁能拿字节4万,说明根本不是找不到下家,人家就是不想便宜老东家。

这事最扎心的点就在这。很多人嘴上喊着仲裁、维权,真轮到自己,HR一施压就签字走人了。你说耗着值不值?太值了。

算法题:IP 到 CIDR

一个 IP,后面跟个 n,很多人第一眼就想暴力枚举。真到手写的时候,通常卡在两处:一是怎么把 IP 当数字滚动,二是每一步到底该切多大的 CIDR 块。这个题看着像字符串题,真做起来其实更像位运算题。

先把话说死:这题不要一上来就拼 255.255.255.0/24 这种字符串。先转整数,后面就顺了。

比如 255.0.0.7,转成 32 位整数后,连续的 n 个地址,本质上就是从这个整数开始,拿若干个 2 的幂大小的块去覆盖。每次拿块的时候要同时满足两个条件:

第一,块的起点必须对齐。 第二,块的大小不能超过剩余地址数。

这地方我一般先看最低位的 1。有多少个尾部 0,就说明当前地址最多能对齐多大的块。剩下的再跟 n 能承受的最大 2 的幂取个最小值。

代码我自己会这样写,够短,也比较像现场能敲出来的版本:

classSolution:
defipToCIDR(self, ip: str, n: int) -> list[str]:
defip_to_int(s: str) -> int:
            ans = 0
for part in s.split('.'):
                ans = (ans << 8) | int(part)
return ans

defint_to_ip(x: int) -> str:
return'.'.join(str((x >> shift) & 255) for shift in (24, 16, 8, 0))

        cur = ip_to_int(ip)
        res = []

while n > 0:
            lowbit = cur & -cur
if lowbit == 0:
                lowbit = 1 << 32

            size = lowbit
while size > n:
                size >>= 1

            prefix = 32 - (size.bit_length() - 1)
            res.append(f"{int_to_ip(cur)}/{prefix}")

            cur += size
            n -= size

return res

拿 ip = "255.0.0.7", n = 10 来看,第一块不能随便给 /28,因为 7 这个地址根本没对齐到 16 的边界。它最多先吃一个 /32,也就是单个地址。往后走到 255.0.0.8,这时候低位对齐好了,就能切更大的块,比如 /29,一下吃 8 个。最后剩 1 个,再补一个 /32。这种“先小后大再收尾”的过程,正是贪心。

这题的贪心点不难,但很容易写歪。常见坑我见过两个:

一个是只看 n,不看起点对齐,结果切出非法网段。 另一个是 cur & -cur 在 cur = 0 时会出特殊情况,这里顺手补一下,不然后面会翻车。

题目本身不复杂,难的是你得接受一件事:IP 只是显示格式,算法真正处理的是整数区间。这个弯一转过来,题就只剩下“每次取一个合法且尽量大的 2 的幂块”了。写完再回头看,味道其实和内存对齐、分页切块差不多。