38岁被裁卡里只有冰冷的 500万,无房,未婚,是直接躺平,还是再找份工作?实在厌倦了上班,但是~
“38岁被裁,卡里只有冰冷的500万,无房未婚,要不要躺平?”我刷到这贴时差点把键盘笑出回车键。
我觉得啊,500万听着多,真要躺到八九十岁,心里会一直跑“通胀进程”,每月开销像内存泄漏,越想越慌。厌倦上班是真的,我也懂那种周一像系统更新的痛。
我的建议偏中间:先把生活成本算清,留足安全垫,然后找份不内耗的活,远程、顾问、项目制都行,赚点“回血包”,躺也躺得踏实。
2000万当然香,可咱先把500万过成“可控的自由”,比硬躺更爽。
算法题:回文链表
昨晚真是…我这边一边盯着线上日志一边刷题,脑子里还在回放那个“Broken pipe”到底是谁先挂的那种感觉,你们懂吧,就很烦。 结果刷到这个“回文链表”,我一下就笑了:链表这玩意儿跟排查现场一样,不能回头看,只能靠你在中途做点“小动作”,不然你永远不知道前后是不是对得上。
回文这事儿你用数组就简单了,双指针一夹就完事。但链表嘛,节点一个个串着,想从尾巴往前对?没门。就像我之前抓包看到 1024 那个卡点一样,数据到了某个边界就会“分段”,你不自己拼起来就会错位。 链表也类似,你得在中间把后半段“反过来”,让它变成能从前往后比对的形态。
所以套路就是:快慢指针找中点,边走边把前半段反转(或者走完再反转后半段也行)。如果长度是奇数,中间那个跳过去别比。然后两条链一边走一边比值,不同就 false,全走完都一样就是 true。最后要不要还原链表?面试一般不强求,但你想写得像线上代码,就顺手还原一下也行(我这里先不还原了,别给自己加戏,哈哈)。
代码我写个你直接能跑的,别整那些花里胡哨的:
from typing import Optional
classListNode:
def__init__(self, val: int = 0, next: "Optional[ListNode]" = None):
self.val = val
self.next = next
classSolution:
defisPalindrome(self, head: Optional[ListNode]) -> bool:
if head isNoneor head.next isNone:
returnTrue
# 1) 快慢指针找中点,同时反转前半段
slow = head
fast = head
prev = None# prev 指向“已经反转好的前半段头”
while fast and fast.next:
fast = fast.next.next
nxt = slow.next
slow.next = prev
prev = slow
slow = nxt
# 2) 如果是奇数长度,slow 现在在中点,跳过它
if fast: # fast 没走到 None,说明长度是奇数
slow = slow.next
# 3) prev 是反转后的前半段,slow 是后半段起点,开始比对
left = prev
right = slow
while left and right:
if left.val != right.val:
returnFalse
left = left.next
right = right.next
returnTrue
你们自己拿 1->2->2->1、1->2、1->2->3->2->1 随便测。这个写法我喜欢的点是:空间 O(1),就地干活,跟线上排障一样,别老想着把所有东西“dump”出来再看,不现实,得学会在链路中间做转换。行了我先去倒杯水…刚说到哪了来着,哦对,回文链表就这么个事儿。