外包的连工位都没有了。。。

文摘   2024-11-13 12:20   山西  

说实话,我真的是服了。今天听到一个事儿,直接让我对某些公司的“外包政策”无语了。你们知道,外包这个词在很多公司里总是被拿来当做省钱的法宝。

可是,连个工位都不给外包员工配,真是……我无力吐槽。

事情是这样的:坐标HW北方某代表处,搬了新办公室。大家兴高采烈的搬进去,结果外包的两位小伙伴,竟然就共享一个工位,而且那工位上只有一个凳子,难道要让他们叠罗汉办公吗?😱

我理解外包员工的待遇一直都不太高,但至少给个基本的工位和座椅吧?

两个人共享一个凳子?外包员工也有自己的尊严吧?真的,难道公司觉得外包员工就该站着工作?🙄

从某种意义上讲,外包员工确实在公司里是“隐形”的存在,但不能连最基本的工作条件都不保障吧?

我觉得,至少得给个正常的工作环境,不然真的是连“人”都不把外包员工当人看了。

说真的不想去外包,在一开始就应该打好技术基础,苦练算法题也是一种方法,所以今天山楂还是会继续分享题目,大家接着学习接着舞~

经典面试题:K 个一组翻转链表

今天我们来聊聊链表翻转的一个经典问题:K 个一组翻转链表(Reverse Nodes in K-Group)

这个题目一看标题就知道,绝对是那种拿到面试题上,面试官眼神炯炯有神的经典题目。既考察了对链表的基本操作,也考察了如何巧妙利用递归或者循环来解决问题。

所以说,想要在面试中给面试官留下深刻印象,掌握这道题目是必须的

问题大致是这样的:

给定一个链表,逐k个节点进行翻转。例如,k=3时,对于链表1→2→3→4→5,翻转后的链表应该是3→2→1→4→5。注意,最后不足k个节点的部分,保持原样。

这道题目其实很考验程序员的思路。

你可以想到几种方法去解,但都需要考虑边界情况、时间复杂度以及内存空间的使用等。下面我就给大家展示一种基于迭代的解法,同时分析一下代码,看看如何在实践中一步步解决这个问题。

首先,我们需要理解题目背后的核心思想。要翻转k个节点,就要分清每一段翻转的范围和链表的连接方式。举个简单例子,假设我们现在的链表是:

1 -> 2 -> 3 -> 4 -> 5

如果k = 3,我们要做的就是先把1->2->3翻转成3->2->1,然后把后面的部分4->5保持不变。

步骤如下:

  1. 先遍历链表,判断是否有k个节点。如果没有,直接返回链表头部。
  2. 如果有k个节点,进行翻转。翻转后,返回翻转后的头节点,并且递归地对剩余的链表继续进行处理。

这里的关键点就是,要在翻转操作中保证链表的连贯性,并且处理好边界条件。

代码实现

下面我们来看具体的Java实现:

public class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || k == 1) {
            return head; // 如果链表为空或者k为1,直接返回
        }
        
        // 先计算链表长度
        int length = 0;
        ListNode curr = head;
        while (curr != null) {
            length++;
            curr = curr.next;
        }
        
        // 如果剩余的节点不足k个,则直接返回原链表
        if (length < k) {
            return head;
        }

        // 翻转前k个节点
        ListNode prev = null;
        ListNode next = null;
        curr = head;
        for (int i = 0; i < k; i++) {
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }

        // 递归处理剩余部分
        if (curr != null) {
            head.next = reverseKGroup(curr, k); // 剩余部分递归翻转
        }

        // prev指向翻转后的头节点
        return prev;
    }
}
  1. 计算链表的长度:我们首先遍历链表,计算出链表的总长度。这是为了判断链表剩余节点是否足够翻转。如果不够k个节点,我们就直接返回原链表。

  2. 翻转前k个节点:我们使用三指针法来翻转前k个节点,分别是prev(前一个节点)、curr(当前节点)、next(下一个节点)。每次将curr.next指向prev,实现节点翻转。循环结束后,prev指向的就是翻转后的链表的头节点。

  3. 递归处理剩余部分:对于剩下的链表,我们通过递归调用reverseKGroup来进行翻转。如果剩余部分不足k个节点,则原封不动地返回。

  4. 连接翻转后的部分:递归返回后,我们需要将翻转后的部分和剩余部分连接起来,确保整个链表的连接顺序是正确的。

优化与分析

  • 时间复杂度:这个解法的时间复杂度是O(N),其中N是链表的长度。我们只遍历了链表一次,并且每次翻转最多处理k个节点。因此总的操作次数是线性的。

  • 空间复杂度:由于我们使用的是递归,每次递归调用都会增加栈空间。最坏情况下,栈的深度是O(N/k),即当链表长度很大,k很小时,栈的空间需求较大。总体而言,空间复杂度是O(N/k),如果在实现时避免递归而改用迭代,则可以将空间复杂度优化为O(1)。


边界情况处理


  • 链表长度小于k:在处理这种情况时,我们会直接返回原链表,这也是题目要求的。
  • k为1:如果k为1,实际上是没有意义的,因为翻转1个节点就是原链表本身。但题目没有限制k为1,所以我们需要判断这一点。

其实这个问题做起来并不难,稍微动动脑筋,做几个小测试就能找到自己的解法。

好啦,今天的分享就到这里,大家有问题的可以留言讨论哦!

-END-


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

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

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