裸睡,一觉醒来发现隔壁躺着hr~

科技   2024-11-21 11:24   山西  
今天这个话题有点劲爆。说真的,裸睡就算了,一觉醒来发现隔壁躺着HR……我第一反应就是:“兄弟,你的体验是真的硬核!”😂

事情是这样的:小伙伴秋招来上海,住酒店的时候前台说今晚只有他一个人住,第二天才有另一位同学到。他一听,这不等于把房间包场了吗?于是彻底放飞自我,裸睡直接安排上,内裤、袜子什么的随手丢到了隔壁床上😌
结果第二天一觉醒来,发现隔壁床多了个人。一问居然是HR!😱
而且,内裤、袜子都被HR整理好了,规规矩矩摆在桌子上。
场面一下子就社死了,想穿衣服都不知道怎么下手,真是离谱到极致。
哈哈,裸睡是真的有风险呀,特别是在这种关键时刻。😅
你们怎么看?这个HR以后还会不会给他发Offer?

算法题:克隆图

最近刷算法题的时候,遇到一道“克隆图”的问题。
问题是这样的:给你一个无向图的起始节点,要求你深拷贝整个图,也就是说得复制每个节点以及它们之间的连接关系。
说到这,我就想起了以前学深拷贝和浅拷贝的经历。新手时总是搞不清楚深拷贝是啥,直到有一次我在集合里改了一个值,结果原对象也被改了,那一刻我终于明白了浅拷贝的“魔力”。
然而今天这个题,不仅要深拷贝,还要把图里节点之间的关系原汁原味地还原出来。

图的克隆到底怎么玩?

首先得理清楚图是什么样子的。如果你对图结构不是很熟悉,可以简单想象成朋友圈里的好友关系:每个节点是一个人,每条边就是两人之间的关系。我们这次的任务是重新造一个朋友圈,但朋友圈里的每个人和他们的好友关系必须跟原来的完全一样。
常见的解法有两种:深度优先搜索(DFS)广度优先搜索(BFS)。两种方法本质一样,区别只在于走图的时候是“直捣黄龙”还是“层层推进”。

用DFS解题

程序员的第一反应当然是用递归,因为递归写起来简单帅气,写完还能给自己点个赞。但递归有个坑,就是需要用一个映射来存储已经访问过的节点,避免“回头路”让自己死循环。
来看代码:
class Node {
    public int val;
    public List<Node> neighbors;

    public Node() {
        val = 0;
        neighbors = new ArrayList<Node>();
    }

    public Node(int _val) {
        val = _val;
        neighbors = new ArrayList<Node>();
    }

    public Node(int _val, ArrayList<Node> _neighbors) {
        val = _val;
        neighbors = _neighbors;
    }
}

class Solution {
    private Map<Node, Node> visited = new HashMap<>();

    public Node cloneGraph(Node node) {
        if (node == nullreturn null;

        // 如果已经访问过,直接返回克隆的节点
        if (visited.containsKey(node)) {
            return visited.get(node);
        }

        // 创建新节点
        Node cloneNode = new Node(node.val, new ArrayList<>());
        visited.put(node, cloneNode);

        // 递归克隆所有邻居
        for (Node neighbor : node.neighbors) {
            cloneNode.neighbors.add(cloneGraph(neighbor));
        }

        return cloneNode;
    }
}
看着是不是很清爽?这段代码的精髓在于利用一个哈希表 visited 来存储原节点和克隆节点的映射关系,既能防止重复克隆,又能有效处理环形图。

再来看BFS解法

如果你像我一样,一看到递归栈爆炸的场景就头皮发麻,那 BFS 可能更适合你。BFS 的实现思路是用一个队列来逐层处理图,先克隆当前节点,再克隆它的邻居节点。
代码如下:
class Solution {
    public Node cloneGraph(Node node) {
        if (node == nullreturn null;

        // 存储原节点到克隆节点的映射
        Map<Node, Node> visited = new HashMap<>();
        Queue<Node> queue = new LinkedList<>();

        // 初始化队列和映射
        Node cloneNode = new Node(node.val, new ArrayList<>());
        visited.put(node, cloneNode);
        queue.add(node);

        // BFS
        while (!queue.isEmpty()) {
            Node curr = queue.poll();

            // 遍历当前节点的邻居
            for (Node neighbor : curr.neighbors) {
                if (!visited.containsKey(neighbor)) {
                    // 如果没被克隆,先克隆再加入队列
                    Node neighborClone = new Node(neighbor.val, new ArrayList<>());
                    visited.put(neighbor, neighborClone);
                    queue.add(neighbor);
                }
                // 添加邻居到当前节点的邻居列表
                visited.get(curr).neighbors.add(visited.get(neighbor));
            }
        }

        return cloneNode;
    }
}
和 DFS 相比,BFS 的代码逻辑更接地气一点,像是在排队过安检:一个节点一个节点地处理,直到所有节点都被克隆完。
写完这两种方法,我发现其实解决克隆图问题的核心是“映射关系”这四个字。无论是 DFS 还是 BFS,我们都要通过一个哈希表来保持原图和新图之间的对应关系。
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。
🔥东哥私藏精品 热门推荐🔥

东哥作为一名超级老码农,整理了全网最全《Java高级架构师资料合集》

资料包含了《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。

Java面试那些事儿
回复 java ,领取Java面试题。分享AI编程,Java教程,Java面试辅导,Java编程视频,Java下载,Java技术栈,AI工具,Java开源项目,Java简历模板,Java招聘,Java实战,Java面试经验,IDEA教程。
 最新文章