38岁被裁卡里只有冰冷的 500万,无房,未婚,是直接躺平,还是再找份工作?实在厌倦了上班~
看到这个吐槽,我第一反应是:这不是“穷到只剩钱”,而是被裁后的安全感突然断电。
卡里500万听着多,但没房、未婚、又厌倦上班,真正焦虑的是“以后怎么活得更确定”。
我的看法是,躺平和上班不是二选一。真想喘口气,可以先给自己一个停机期:把日常开销、父母健康、意外风险算清楚,留足几年底气;然后用更轻的方式回到职场,比如短工、项目制、顾问、或者换到节奏更正常的岗位。
想要2000万才敢躺平,本质是把幸福押在一个数字上。但人生不是等额度够了才开始。钱是工具,方向和状态才是答案。
面试题:回文链表
那天我在工位上刚把咖啡拆开,手机就响了,群里有人说“东哥,回文链表这题你不是老会了吗,给个能直接过的 Java 呗”,我当时脑子还在想中午吃啥,结果一看题目:给你一个单链表,判断它是不是回文。嗯…这个就很像你晚上走到一半又折回来拿充电器,对吧,前半段和后半段得对上。
我以前一开始也犯傻,直接把链表转数组,然后双指针夹起来比,确实能过,但你们面试官一皱眉:空间 O(n) 啊。然后就开始整那种“别额外开数组”的玩法。跟线上抓包那种感觉有点像,表面上数据是一条流,实际上你得把中间那段翻过来再对一下,不然你只能干瞪眼。
所以正经写法就三步,嘴上说三步,手上其实就一口气写完: 1)快慢指针找中点,fast 一次两步,slow 一次一步,fast 到头 slow 就在中间附近。 2)把 slow 后面那段就地反转(反转链表那个老套路),等于把“后半段”倒过来。 3)拿 head 和 反转后的头,一边走一边比值,不一样就 false。想稳一点可以比完再反转回去,把链表复原,虽然大多数题不要求,但写着顺手。
直接上代码吧,我写个完整点的,省得你们复制粘贴还缺类:
publicclassPalindromeLinkedList{
staticclassListNode{
int val;
ListNode next;
ListNode(int v) { this.val = v; }
}
publicbooleanisPalindrome(ListNode head){
if (head == null || head.next == null) returntrue;
// 1) 找中点:slow 在中间,fast 走两步
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 如果是奇数长度,slow 再往前一步,跳过中间那个
if (fast != null) { // fast 没到 null,说明长度是奇数
slow = slow.next;
}
// 2) 反转后半段
ListNode right = reverse(slow);
// 3) 对比左右两段
ListNode left = head;
ListNode p = right;
boolean ok = true;
while (p != null) { // 右边更短或相等,按右边走
if (left.val != p.val) {
ok = false;
break;
}
left = left.next;
p = p.next;
}
// 可选:复原链表(看你们习惯,面试写上更“干净”)
reverse(right);
return ok;
}
private ListNode reverse(ListNode head){
ListNode prev = null, cur = head;
while (cur != null) {
ListNode nxt = cur.next;
cur.next = prev;
prev = cur;
cur = nxt;
}
return prev;
}
}
你们注意两个小坑哈,我以前也卡过:一个是奇数长度,中间那个不用比,所以 fast 不为 null 的时候 slow 要多走一步;另一个是比较的时候别用 left != null 当条件,应该用右半段指针 p != null,因为右半段是你“有效对照组”,不然你会比过头。
行了,我要去把咖啡喝了…对了谁刚刚艾特我说链表反转老忘,别慌,就记住三指针:prev、cur、nxt,手一抖也能写出来。