Python技术迷

38岁被裁卡里只有冰冷的 500万,无房,未婚,是直接躺平,还是再找份工作?实在厌倦了上班,但是~

“38岁被裁,卡里只有冰冷的500万,无房未婚,要不要躺平?”我刷到这贴时差点把键盘笑出回车键。

Image

我觉得啊,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”出来再看,不现实,得学会在链路中间做转换。行了我先去倒杯水…刚说到哪了来着,哦对,回文链表就这么个事儿。