老大哥42岁,干了20年被公司优化,起哄让他请散伙饭,他直接一个没理、公司赔偿+公积金+失业金拢共 40来万
这两天刷到个吐槽:一位42岁的老大哥,在公司写代码写到手指起茧,干了快20年,结果被“友好请走”。同事们起哄:散伙饭得安排吧,热闹一下,毕竟一起熬过几个通宵。
网友分两派。有人说“拿了赔偿还不请客?太不讲情分”,还有人更狠:“公司省下的人力成本,关你同事啥事,别把别人的钱当团建基金。”也有人提醒:赔偿+公积金+失业金凑出四十来万,看着多,后面房贷娃学费照样追着跑。
我觉得这事挺现实:同事情谊是真的,可起哄也是真的。想请就请一顿家常菜,不想请就装死,毕竟“优化”都能叫成长,同事的胃口也别太有成长性
算法题:贪吃蛇
昨晚我在地铁上刷到个“贪吃蛇算法题”,我当时还挺自信:这不就是小时候诺基亚上那条蛇嘛……结果一写,哎哟喂,最容易翻车的点不是“怎么走”,是“蛇尾巴到底算不算撞自己”…就是那个,怎么说呢,你头走过去的时候尾巴同时也在动,你如果没吃到食物,尾巴会缩一格,那一格其实可以被头“占用”一下的,不然你会莫名其妙判死。
我一般就把蛇当成一个队列,头在右边,尾在左边。再配个 set 存身体坐标,查撞自己 O(1)。每一步:先算新头;先判断撞墙;再判断是不是吃到食物——吃到就只加头不删尾(长度+1),没吃到就加头同时删尾(长度不变)。关键细节来了:没吃到的时候,你要先把尾巴从 set 里暂时挪出去,再判断“新头是否撞身体”,因为尾巴要走了,你还拿它当障碍就离谱了,跟你上班挤电梯一样,人都出去了你还说“这位置有人占着”。
给你们一个我自己写的核心版本,偏“算法题模拟”的写法,盘面 n 行 m 列,food 给一堆坐标,moves 给方向串,返回每一步的分数(吃到几个)以及是否挂了:
from collections import deque
defsnake_game(n, m, food, moves, start=(0, 0)):
"""
n, m: 网格大小
food: [(r,c), ...] 按顺序出现
moves: e.g. "RRDDLU"
return: (score, alive)
"""
dir_map = {'U': (-1, 0), 'D': (1, 0), 'L': (0, -1), 'R': (0, 1)}
food = list(food)
fi = 0
body = deque([start]) # 左尾右头
occ = {start}
score = 0
for ch in moves:
dr, dc = dir_map[ch]
hr, hc = body[-1]
nr, nc = hr + dr, hc + dc
# 1) 撞墙
if nr < 0or nr >= n or nc < 0or nc >= m:
return score, False
new_head = (nr, nc)
will_eat = (fi < len(food) and food[fi] == new_head)
# 2) 不吃:尾巴要走,先“腾位置”
ifnot will_eat:
tail = body.popleft()
occ.remove(tail)
# 3) 撞自己(注意:上面可能已经把尾巴挪掉了)
if new_head in occ:
return score, False
# 4) 进位
body.append(new_head)
occ.add(new_head)
# 5) 吃到就加分 & 食物下一个
if will_eat:
score += 1
fi += 1
# 吃到就不删尾(上面没删),自然就变长了
return score, True
你们要是写在线判题那种“每次给一个方向,返回分数/死了”,也一样,把 for ch in moves 换成 move(ch) 单步就行。反正核心就这几句:队列表示身体、set 判重、以及那个“尾巴先挪出去再判断撞自己”的小心机。讲真这点不处理好,感觉像你写了个看起来很对的游戏,但蛇会在原地突然猝死……跟我周一早高峰一样,莫名其妙就没了。