⚡每日算法&面试题⚡一起肥学

131 阅读1分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

🔮算法题

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:


输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:

输入:head = []
输出:[]
示例 3:

输入:head = [1]
输出:[1]
提示:

链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100

🔮一点点思路

我想这道题的难点在这里**进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)**也就是相邻的两个节点进行交换,具体的实现我们就可以用一个新节点来配合链表进行交换。这里在推荐的时候保证代码的整洁性还是推荐用递归的方法。递归法最适合这种有规律的操作了。

🔮源码和详解

public ListNode swapPairs(ListNode head) {
//用来进行初始的判断对应着实例2和3,同时也是递归到最后返回的值
        if (head == null || head.next == null) {
            return head;
        }
        //我下面花个图帮助大家理解,数据结构的有图最好理解了
        ListNode newHead = head.next;
        //这个可以倒着看,从最后一个看就好理解了
        head.next = swapPairs(newHead.next);
        newHead.next = head;
        return newHead;
    }


在这里插入图片描述 关于写递归我的一些经验:

我们应该关心的主要有三点:

返回值
调用单元做了什么
终止条件

🔮面试题

谈谈消息队列(MessageQueue) 消息队列(MessageQueue)是服务架构中常见的组件,可用于服务间解耦、事件广播、任务异步/延迟处理等,常用于分布式系统之间互相信息的传递。接下来对消息队列的实现如何满足几种消费场景进行简单阐述。

一 . 消息队列相关概念

1、生产者(Producer): 负责产生消息;

2、消费者(Consumer): 负责消费消息;

3、消息(Message): 在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象;

4、消息队列(Message Queue): 一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

5、消息代理(Message Broker): 负责存储/转发消息,转发分为推和拉两种。

拉是指Consumer主动从Message Broker获取消息; 推是指Message Broker主动将Consumer感兴趣的消息推送给Consumer。