某米员工爆料:35岁被裁后,投百份简历无人问津,一气之下把薪资由2W调为3W,简历改成英文,结果出乎意料!!!

文摘   2024-11-27 12:27   山西  

某米员工被裁后,投了100多份简历都没人理,一怒之下反其道而行:把薪资从2W涨到3W,还把简历改成英文。结果呢?竟然有人回复了!😂这操作属实有点高低反转的意思。

我觉得这事儿,简直就是“逆向优化”的典范。你看,平时咱们调代码也是这样,越是紧盯着问题死磕,越难出结果,换个思路,bug可能就消失了。
把薪资调高、改英文简历,看似“逆操作”,其实背后是对目标群体的精准定位:直接告诉公司,“我不是廉价劳动力,认真点看我的履历!”
而且说实话,大厂程序员的背景再加上英文简历的包装,直接让HR觉得你“国际范儿”拉满。其实很多时候,我们的技能是有价值的,但如果用错误的方式表达,反而会让人低估你。
所以,兄弟们,找工作别太“谦虚”。合适的包装不是骗人,而是给别人一个重新认识你的机会。

算法题:重排链表

前几天刷到一道算法题:重排链表。

问题描述

重排链表的意思是:给定一个链表,将其节点重新排列成 L0 → Ln → L1 → Ln-1 → L2 → Ln-2……这样的顺序。例如,给你一个链表:
1 → 2 → 3 → 4 → 5
重排后是:
1 → 5 → 2 → 4 → 3
看到这个顺序,第一个反应是不是觉得 "嗯?有点意思"?其实这题的核心是对链表的操作:你得先找到中间节点,把链表分成两半,然后把后半部分反转,最后把两半合并。没别的,老三样:快慢指针、链表反转、链表合并。🙃

解题思路

Step 1: 找到中间节点

找到链表的中间节点,最经典的做法就是用快慢指针。慢指针每次走一步,快指针每次走两步,当快指针到达链表末尾时,慢指针刚好到中间节点。
private ListNode findMiddle(ListNode head) {
    ListNode slow = head, fast = head;
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }
    return slow;
}

Step 2: 反转链表后半部分

拿到中间节点后,把链表从中间断开,然后对后半部分进行反转。链表反转是经典操作了,几行代码搞定:
private ListNode reverseList(ListNode head) {
    ListNode prev = null, curr = head;
    while (curr != null) {
        ListNode nextTemp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}
有意思的是,这里如果忘记断开链表,就会导致一个漂亮的无限循环。所以,debug的时候别忘了检查链表节点的next是否正确指向。

Step 3: 合并链表

最后一步,把前半部分和反转后的后半部分交替合并。例如,1 → 2 → 35 → 4 合并成 1 → 5 → 2 → 4 → 3。这个操作需要用两个指针交替操作。
private void mergeLists(ListNode l1, ListNode l2) {
    while (l1 != null && l2 != null) {
        ListNode l1Next = l1.next;
        ListNode l2Next = l2.next;
        
        l1.next = l2;
        if (l1Next == nullbreak;
        l2.next = l1Next;
        
        l1 = l1Next;
        l2 = l2Next;
    }
}

完整代码

最后,把这些步骤拼起来,就是完整的解决方案了:
public void reorderList(ListNode head) {
    if (head == null || head.next == nullreturn;

    // Step 1: Find the middle of the list
    ListNode mid = findMiddle(head);

    // Step 2: Reverse the second half
    ListNode secondHalf = reverseList(mid.next);
    mid.next = null// Disconnect the first half and the second half

    // Step 3: Merge the two halves
    mergeLists(head, secondHalf);
}
这个题说起来不难,但代码细节不少,特别是链表的next指针操作,一不留神就容易乱指。写完之后,不调试个三四遍,还真不放心。链表嘛,天生是个 "容易踩坑" 的数据结构。
另外,如果你去面试的时候遇到这题,千万别只写代码,面试官肯定还会问优化点、边界条件啥的。比如:
  • 空链表怎么办?
  • 单节点链表或者双节点链表呢?
  • 能不能在O(1)的空间复杂度下完成?
这些都得考虑到。😅

-END-


ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言


程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章