【备战秋招】每日一题:4月15日美团春招:题面+题目思路 + C++/python/js/Go/java带注释

news2024/9/28 9:33:13

2023大厂笔试模拟练习网站(含题解)
www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。

提交链接:

https://codefun2000.com/p/P1138

为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

在线评测链接:P1237

题目内容

塔子哥所在的国家有 n 个城市,这 n 个城市排成一列,按顺序编号为 1,2,3,...,n。然而,由于历史原因和地理条件等多种原因,这些城市之间并没有相互连接的铁路,导致交通十分不便。

为了改善这种情况,政府决定修建一些铁路来提高城市之间的交通效率。具体来说,政府计划在未来的 T 天内进行一系列铁路建设工作。每一天,政府会进行如下操作之一:

  • L x:在编号为 x 的城市和其左边的城市之间修建一条铁路,以便两个城市之间的交通更加便利。如果 x 已经位于最左边,或者 x 和它左边的城市之间已经存在铁路,则该操作无效。

  • R x:在编号为 x 的城市和其右边的城市之间修建一条铁路,以便两个城市之间的交通更加便利。如果 x 已经位于最右边,或者 x 和它右边的城市之间已经存在铁路,则该操作无效。

  • Q x:查询从编号为 x 的城市出发,最远能够到达的向左和向右的城市的编号。

塔子哥需要编写一段程序来模拟这一系列操作,并及时输出每个 Q x 操作的结果。通过这个程序,政府可以更加高效地规划城市之间的交通网络,从而促进经济和社会的发展。

输入描述

第一行输入两个正整数 n , T ; 接下来 T 行,每行输入形如题面中的其中一种。

1\le n\le 100001\le T\le 2001\le x\le n

输出描述

对于每一个Q x 操作,输出一行两个正整数,分别表示 x 往左边和往右边最远能到达的城市编号中间用空格隔开。

样例

输入

3 5
Q 2
L 2
Q 2
R 2
Q 2

输出

2 2
1 2
1 3

思路

并查集

考虑将n个城市看成图上的n个节点。那么

  • 每次将两个城市之间连通,相当于在点 u 和点 v 之间连一条

  • 每次查询一个城市可以向左和向右到达的最远城市,这启发我们并查集合并时需要维护两个值,一个合并时总是指向值更小的,一个合并时总是指向值更大的。即维护集合最大最小值

知识点学习:并查集

完全没接触过或不太熟悉并查集的同学,可以参考以下学习路线:

1.并查集算法讲解 -C++实现

图论——并查集(详细版)

看完本视频之后对并查集先有一个初步的了解

2.刷题

根据塔子哥给出的类似题目推荐,刷完Leetcode的相关题目以及CodeFun2000相关题目推荐

3.进阶应用(偏竞赛难度)

如果对并查集的应用有比较大的兴趣,希望进一步接触更多更妙的内容,可以学习

1.OI-WIKI-并查集应用

2.百度搜集ATC,CF以及ICPC/CCPC区域赛真题

类似题目推荐

Leetcode

  1. 547. 朋友圈

  2. 130. 被围绕的区域

  3. 200. 岛屿数量

  4. 684. 冗余连接

  5. 323. 无向图中连通分量的数目

CodeFun2000

以下问题用BFS/DFS解决都能解决。为了更好的学习并查集,希望大家能够尽量使用并查集完成

1.P1147 阿里巴巴 2023.4.3-研发岗-第二题-又一个连通块数数题

2.P1094. 米哈游 2023.03.19-第一题-塔子哥的RBG矩阵

时间复杂度:O(n\log n)

代码

CPP

#include <bits/stdc++.h>
using namespace std;
​
const int N = 10010;
// pL:维护集合最小值 , pR:最大值
int pL[N], pR[N];
int n, m;
char op[2];
int num;
// 并查集 非递归写法
int find(int p[], int x) {
    int root = x;
    while (root != p[root]) root = p[root];
    while (x != p[x]) {
        int nx = p[x];
        p[x] = root;
        x = nx;
    }
    return root;
}
​
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) pL[i] = pR[i] = i;
    // 模拟
    for (int i = 1; i <= m; ++i) {
        scanf("%s%d", op, &num);
        if (*op == 'L') {
            if (num == 1) continue;
            int pa = find(pL, num - 1), pb = find(pL, num);
            if (pa == pb) continue ;
            pL[pb] = pa;
​
            pa = find(pR, num - 1), pb = find(pR, num);
            pR[pa] = pb;
        } else if (*op == 'R') {
            if (num == n) continue ;
            int pa = find(pL, num), pb = find(pL, num + 1);
            if (pa == pb) continue ;
            pL[pb] = pa;
​
            pa = find(pR, num), pb = find(pR, num + 1);
            pR[pa] = pb;
        } else {
            printf("%d %d\n", find(pL, num), find(pR, num));
        }
    }
​
    return 0;
}

Java

import java.util.Objects;
import java.util.Scanner;
​
public class Main {
​
    static int N = 100010;
    // pL:维护集合最小值 , pR:最大值
    static int[] pL = new int[N];
    static int[] pR = new int[N];
​
    static Scanner sc = new Scanner(System.in);
    // 并查集 : 寻找父亲
    static int find(int[] p, int x) {
        if (x != p[x]) p[x] = find(p, p[x]);
        return p[x];
    }
​
    public static void main(String[] args) {
        int n = sc.nextInt();
        int m = sc.nextInt();
        for (int i = 1; i <= n; ++i) pL[i] = pR[i] = i;
        // 模拟
        for (int i = 0; i < m; ++i) {
            String op = sc.next();
            int x = sc.nextInt();
​
            if ("Q".equals(op)) {
                int L = find(pL, x);
                int R = find(pR, x);
                System.out.println(L + " " + R);
            } else if ("L".equals(op)) {
                if (x == 1) continue;
                int pa = find(pL, x - 1);
                int pb = find(pL, x);
                if (pa == pb) continue;
                pL[pb] = pa;
​
                pa = find(pR, x - 1);
                pb = find(pR, x);
                if (pa == pb) continue;
                pR[pa] = pb;
            } else {
                if (x == n) continue;
                int pa = find(pL, x);
                int pb = find(pL, x + 1);
                if (pa == pb) continue;
                pL[pb] = pa;
​
                pa = find(pR, x);
                pb = find(pR, x + 1);
                if (pa == pb) continue;
                pR[pa] = pb;
            }
        }
    }
​
}

Python

n, T = map(int, input().split())
f = [i for i in range(n+1)]
​
# mi维护集合最小值 , mx 维护 最大值
mi = [i for i in range(n+1)]
mx = [i for i in range(n+1)]
# 并查集 模板
def find(x):
    global f
    if f[x] == x:
        return x
    f[x] = find(f[x])
    return f[x]
​
def mer(x, y):
    global f
    x = find(x)
    y = find(y)
    if x != y:
        f[x] = y
        mx[y] = max(mx[x], mx[y])
        mi[y] = min(mi[x], mi[y])
        
for ii in range(T):
    p, x = input().split()
    x = int(x)
    if p == 'L' and x != 1:
        mer(x, x-1)
    if p == 'R' and x != n:
        mer(x, x+1)
    if p == 'Q':
        x = find(x)
        print(mi[x], mx[x])

Go

package main
​
import (
    "fmt"
)
​
var f []int
var mi []int
var mx []int
​
func main() {
    var n, T int
    fmt.Scan(&n, &T)
    // f: 父亲
    f = make([]int, n+1)
    // mi mx 维护每个点所在集合的最大值最小值
    mi = make([]int, n+1)
    mx = make([]int, n+1)
    // 初始化 指向自己
    for i := 0; i <= n; i++ {
        f[i] = i
        mi[i] = i
        mx[i] = i
    }
    // 模拟
    for i := 0; i < T; i++ {
        var p string
        var x int
        fmt.Scan(&p, &x)
        
        if p == "L" && x != 1 {
            mer(x, x-1)
        }
        if p == "R" && x != n {
            mer(x, x+1)
        }
        if p == "Q" {
            x = find(x)
            fmt.Println(mi[x], mx[x])
        }
    }
}
​
// 并查集 模板 
​
func find(x int) int {
    if f[x] == x {
        return x
    }
    f[x] = find(f[x])
    return f[x]
}
​
func mer(x, y int) {
    x = find(x)
    y = find(y)
    if x != y {
        f[x] = y
        mx[y] = max(mx[x], mx[y])
        mi[y] = min(mi[x], mi[y])
    }
}
// 最大最小值
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
​
func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
  input += data;
});
​
process.stdin.on('end', () => {
    lines = input.trim().split('\n');
    let f = []
    let mi = []
    let mx = []
    const arr = lines[0].split(' ')
    const n = parseInt(arr[0])
    const T = parseInt(arr[1])
​
    // mi mx 维护每个点所在集合的最大值最小值
    for (let i = 0; i <= n; i++) {
        f[i] = i
        mi[i] = i
        mx[i] = i
    }
    // 并查集模板
    function find(x) {
        if (f[x] === x) {
            return x
        }
        f[x] = find(f[x])
        return f[x]
    }
​
    function mer(x, y) {
        x = find(x)
        y = find(y)
        if (x !== y) {
            f[x] = y
            mx[y] = Math.max(mx[x], mx[y])
            mi[y] = Math.min(mi[x], mi[y])
        }
    }
    // 模拟
    for (let i = 1; i <= T; i++) {
        const line = lines[i].trim().split(' ')
        const p = line[0]
        const x = parseInt(line[1])
​
        if (p === 'L' && x !== 1) {
            mer(x, x-1)
        }
        if (p === 'R' && x !== n) {
            mer(x, x+1)
        }
        if (p === 'Q') {
            const res = find(x)
            console.log(mi[res], mx[res])
        }
    }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单实用折叠面板可以折叠收起展开内容区域

前端简单实用折叠面板可以折叠收起展开内容区域, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id12860 效果图如下: 代码如下: # 简单实用折叠面板可以折叠收起展开内容区域。 #### 使用方法 使用方法 <!-- leftText:做标题 rigText:…

智能算法终极大比拼,以CEC2005测试函数为例,十种智能算法直接打包带走,不含任何套路!

包含人工蜂群(ABC)、灰狼(GWO)、差分进化(DE)、粒子群(PSO)、麻雀优化(SSA)、蜣螂优化(DBO)、白鲸优化(BWO)、遗传算法(GA)、粒子群算法(PSO)&#xff0c;基于反向动态学习的差分进化算法&#xff0c;共十种算法&#xff0c;直接一文全部搞定&#xff01; 由于上一篇代码&…

赋能矿山 | KaiwuDB 智慧矿山解决方案

行业背景 随着勘探和矿产开发技术的提高以及能源需求量的大幅增加&#xff0c;矿山开发速度持续加快。随之而来的诸多弊端&#xff0c;如矿山资源综合利用率低、管理方式粗放、安全和环境污染等问题日益突出&#xff0c;使得矿业智能化建设迫在眉睫。 近年来&#xff0c;政府…

【算法与数据结构】160、LeetCode相交链表

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题题目蛮长的。说的大概意思就是对比指针地址&#xff0c;只要相等了&#xff0c;那就是相交节点。…

华为OD机试之执行时长(Java源码)

执行时长 题目描述 为了充分发挥GPU算力&#xff0c;需要尽可能多的将任务交给GPU执行&#xff0c;现在有一个任务数组&#xff0c;数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务&#xff0c;一次执行耗时1秒&#xff0c;在保证GPU不空…

论文解读 | 机器人路径跟踪的受控纯追踪法

原创 | 文 BFT机器人 01 摘要 这篇文章是关于机器人路径跟踪的受控纯追踪算法的研究。文章介绍了传统的纯追踪算法以及相关变体&#xff0c;并提出了受控纯追踪算法作为本文的主要贡献。该算法旨在适应实际环境中的服务和工业移动机器人&#xff0c;提供方法来调整机器人的平移…

关于spring boot报javax/servlet/MultipartConfigElement错误以及的问题

springboot在启动时报java.lang.NoClassDefFoundError: javax/servlet/MultipartConfigElement 解决方法&#xff1a;将pom.xml文件中的provided删掉

盛元广通生物化学重点实验室化学品信息化安全管理系统

生物化学重点实验室是国家基础研究和高技术研究的重要基地&#xff0c;是培养和造就高层次创新型人才的重要基地。为保障实验室化学品安全使用&#xff0c;实验人员可通过现场或移动端管理系统实现化学品安全使用与存储。盛元广通生物化学重点实验室化学品信息化安全管理系统具…

方波信号拆分及合成

1. 前言 数字处理器产生的都是方波信号&#xff0c; 做EMC会有各种高频率的辐射超标。比如下图为EMC测试辐射图&#xff0c;其中480MHz左右频率超标&#xff0c;那么就需要分析这个频率是谁产生的&#xff0c;但是整个系统都没有谁使用了这么高的频率信号。但是一般根据经验都知…

mysql-explain-其他

eq_ref 主键和唯一索引的所有部分被连接使用&#xff0c;最多只会返回一条符合条件的记录【主键关联查询】 ref: 根节点二分查找 没有使用唯一索引&#xff0c;而是走了普通索引【二级索引】或者唯一索引的部分前缀&#xff0c;有可能查出多个符合条件的行。 range 范围扫…

全网最全的Python教程(非常详细),从零基础入门到上岗!

Python的火&#xff0c;有目共睹。Python陆续登上了IEEE、PYPL排行榜单之首&#xff0c;对于Python的崛起TIOBE排行榜也给予了回应&#xff1a;由于全球流行度在过去一年中涨幅最高&#xff01; 同时人工智能的兴起&#xff0c;也给了Python无限可能&#xff0c;让Python越来越…

Systick实现中断-GD32

定时器中断-GD32 include "gd32f10x.h" #include "systick.h" #include "LED.h"volatile static uint32_t delay_reload; volatile static uint32_t delay_value;/*!\brief configure systick\param[in] none\param[out] none\retval …

asp.net试卷自动生成系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net试卷自动生成系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net试卷自动生成系统VS开发sq…

Java 泛型:概念、语法和应用

文章目录 一、什么是 Java 泛型&#xff1f;二、为什么要使用泛型三、Java 泛型的语法四、Java 泛型的应用五、Java 泛型的示例六、总结 随着 Java 编程语言的不断发展和更新&#xff0c;Java 1.5 版本引入了一项全新的特性——Java 泛型&#xff08;Java Generic&#xff09;&…

Classic AUTOSAR专题 | I/O模块简介

书接上回&#xff0c;上期专题内容中小怿介绍了Classic AUTOSAR之存储模块&#xff0c;相信大家对存储以及NvM已经有了初步的认识了解。接下来我们将继续介绍Classic AUTOSAR专题之I/O模块&#xff0c;同时感兴趣的小伙伴还请持续关注后续内容~ 01 AUTOSAR I/O功能概述 I/O(Inp…

2023年6月DAMA-CDGA/CDGP数据治理工程师认证这里报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)【下篇】

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

ZYNQ 7020 开发板开机检测

拿到开发板后检测开发板能否正常工作。 检测需要的工具&#xff1a;电脑、显示器(有HDMI接口)、HDMI线、鼠标、键盘、网线、USB转串口驱动软件。 在检测之前&#xff0c;先要在自己的电脑上安装好终端工具和USB转串口的驱动软件。 终端工具我安装的是 MobaXterm。 USB转串口的驱…

深入理解JavaScript模块化开发

前言&#xff1a; 随着JavaScript应用程序的复杂性不断增加&#xff0c;模块化开发成为了一种必备的技术。通过将代码划分为模块&#xff0c;我们可以提高代码的可维护性、可重用性和可扩展性。在本文中&#xff0c;我们将深入探讨JavaScript模块化开发的概念、优势和不同的模块…