news 2026/9/3 2:43:03

(新卷,100分)- 会议室占用时间(Java JS Python C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分)- 会议室占用时间(Java JS Python C)

(新卷,100分)- 会议室占用时间(Java & JS & Python & C)

题目描述

现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间,格式为:

[[会议1开始时间, 会议1结束时间], [会议2开始时间, 会议2结束时间]]

请计算会议室占用时间段。

输入描述

第一行输入一个整数 n,表示会议数量

之后输入n行,每行两个整数,以空格分隔,分别表示会议开始时间,会议结束时间

输出描述

输出多行,每个两个整数,以空格分隔,分别表示会议室占用时间段开始和结束

备注
  • 会议室个数范围:[1, 100]
  • 会议室时间段:[1, 24]
用例
输入4
1 4
2 5
7 9
14 18
输出1 5
7 9
14 18
说明

输入:[[1,4],[2,5],[7,9],[14,18]]

输出:[[1,5],[7,9],[14,18]]

说明:时间段[1,4]和[2,5]重叠,合并为[1,5]

输入2
1 4
4 5
输出1 5
说明

输入:[[1,4],[4,5]]

输出:[[1,5]]

说明:时间段[1,4]和[4,5]连续

题目解析

本题实际考试时为核心代码模式,非ACM模式,即无需处理输入输出。

本博客代码实现仍然以ACM模式处理,但是会将 "输入输出处理" 与 "核心代码" 分开,大家只看核心代码即可。

本题是区间合并问题。

我们可以将所有区间开始起始位置升序,然后取出第一个区间作为基准值pre,从第二个区间cur开始遍历:

  • 如果 cur.start <= pre.end,则说明两个区间有重叠,此时我们应该将两个区间合并,合并策略是将pre.end =max(pre.end, cur.end),比如:

    pre = [1, 4],cur = [2, 5],那么按此策略合并后,pre = [1, 5]

    pre = [1, 100],cur = [7, 9],那么按此策略合并后,pre = [1, 100]
  • 如果 cur.start > pre.end,则说明两个区间无交集,此时pre无法和后面任何区间合并(因为已经按照开始时间升序了,后面区间的开始时间肯定也大于pre.end),此时pre时间段就是一个独立的会议室占用时间,我们将它缓存记录下来,并将更新pre = cur,即将cur作为新的基准值和后面的区间比较

按此逻辑,即可完成所有区间的合并。

JS算法源码
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; // 输入输出处理 void (async function () { const n = parseInt(await readline()); const roomTimes = []; for (let i = 0; i < n; i++) { roomTimes.push((await readline()).split(" ").map(Number)); } merge(roomTimes).forEach(([start, end]) => console.log(`${start} ${end}`)); })(); // 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法实现即可 function merge(roomTimes) { // 将各个会议按照开始时间升序 roomTimes.sort((a, b) => a[0] - b[0]); // 记录合并后的会议室占用时间段 const ans = []; // 上一个会议占用时间段 let pre = roomTimes[0]; for (let i = 1; i < roomTimes.length; i++) { // 当前会议占用时间段 const cur = roomTimes[i]; if (cur[0] <= pre[1]) { // 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 // 注意合并时,结束时间取两个时间段中较大的结束时间 pre[1] = Math.max(pre[1], cur[1]); } else { // 否则不可以合并 ans.push(pre); pre = cur; } } ans.push(pre); return ans; }
Java算法源码
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { // 输入输出处理 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] roomTimes = new int[n][2]; for (int i = 0; i < n; i++) { roomTimes[i][0] = sc.nextInt(); roomTimes[i][1] = sc.nextInt(); } int[][] res = new Main().merge(roomTimes); for (int[] time : res) { System.out.println(time[0] + " " + time[1]); } } // 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法实现即可 public int[][] merge(int[][] roomTimes) { // 将各个会议按照开始时间升序 Arrays.sort(roomTimes, (a, b) -> a[0] - b[0]); // 记录合并后的会议室占用时间段 ArrayList<int[]> list = new ArrayList<>(); // 上一个会议占用时间段 int[] pre = roomTimes[0]; for (int i = 1; i < roomTimes.length; i++) { // 当前会议占用时间段 int[] cur = roomTimes[i]; if (cur[0] <= pre[1]) { // 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 // 注意合并时,结束时间取两个时间段中较大的结束时间 pre[1] = Math.max(pre[1], cur[1]); } else { // 否则不可以合并 list.add(pre); pre = cur; } } list.add(pre); return list.toArray(new int[0][]); } }
Python算法源码
# 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法实现即可 def merge(roomTimes): # 将各个会议按照开始时间升序 roomTimes.sort(key=lambda x: x[0]) # 记录合并后的会议室占用时间段 ans = [] # 上一个会议占用时间段 pre = roomTimes[0] for i in range(1, len(roomTimes)): # 当前会议占用时间段 cur = roomTimes[i] if cur[0] <= pre[1]: # 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 # 注意合并时,结束时间取两个时间段中较大的结束时间 pre[1] = max(pre[1], cur[1]) else: # 否则不可以合并 ans.append(pre) pre = cur ans.append(pre) return ans # 输入输出处理 n = int(input()) roomTimes = [] for _ in range(n): roomTimes.append(list(map(int, input().split()))) for start, end in merge(roomTimes): print(f"{start} {end}")
C算法源码
#include <stdio.h> #include <stdlib.h> int rows = 0; int cmp(const void *a, const void *b) { return (*(int **) a)[0] - (*(int **) b)[0]; } // 本题实际考试时会核心代码模式,无需处理输入输出,只需要写出merge方法相关实现即可 int **merge(int **roomTimes, int roomTimes_size) { // 将各个会议按照开始时间升序 qsort(roomTimes, roomTimes_size, sizeof(int *), cmp); // 记录合并后的会议室占用时间段 int** res = (int**) malloc(sizeof(int*) * roomTimes_size); // 上一个会议占用时间段 int* pre = roomTimes[0]; // 当前会议占用时间段 for(int i=1; i<roomTimes_size; i++) { int* cur = roomTimes[i]; if(cur[0] <= pre[1]) { // 当前会议开始时间 <= 上一个会议结束时间,则两个会议时间重叠,可以合并 // 注意合并时,结束时间取两个时间段中较大的结束时间 if(cur[1] > pre[1]) { pre[1] = cur[1]; } } else { res[rows++] = pre; pre = cur; } } res[rows++] = pre; return res; } // 输入输出处理 int main() { int n; scanf("%d", &n); int **roomTimes = (int **) malloc(sizeof(int *) * n); for (int i = 0; i < n; i++) { roomTimes[i] = (int *) malloc(sizeof(int) * 2); scanf("%d %d", &roomTimes[i][0], &roomTimes[i][1]); } int **res = merge(roomTimes, n); for (int i = 0; i < rows; i++) { printf("%d %d\n", res[i][0], res[i][1]); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 20:39:56

【计算机毕业设计案例】基于迁移学习机器学习的睡意检测报警系统

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/2 21:29:07

主流的消息队列MQ比较,详解MQ的4类应用场景(上)

一、序言消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0…

作者头像 李华
网站建设 2026/9/2 21:33:02

1.15 指标异常波动分析实战:日活下跌50%?5步定位问题根源

1.15 指标异常波动分析实战:日活下跌50%?5步定位问题根源 引言 指标异常波动是数据分析中最常见也最重要的问题。当日活突然下跌50%,如何快速定位问题根源?本文将实战演示指标异常波动分析的5步法,帮你快速找到问题并制定解决方案。 一、指标异常波动分析五步法 1.1 完…

作者头像 李华
网站建设 2026/9/2 21:32:47

人工智能交叉学科创新选题:7个技术前沿领域的深度研究与展望

毕业论文选题排名&#xff1a;7大AI热门方向推荐 工具对比速览 工具名称 核心优势 适用场景 生成速度 特色功能 Aibiye 学术数据库精准匹配 开题报告/文献综述 即时生成 无限改稿/论文仿写 Aicheck 全学科覆盖 初稿快速生成 20-30分钟 自动插入图表/公式 秒篇 …

作者头像 李华
网站建设 2026/9/2 21:31:17

面向未来科技发展的AI选题:7大高影响力研究领域的系统分析

毕业论文选题排名&#xff1a;7大AI热门方向推荐 工具对比速览 工具名称 核心优势 适用场景 生成速度 特色功能 Aibiye 学术数据库精准匹配 开题报告/文献综述 即时生成 无限改稿/论文仿写 Aicheck 全学科覆盖 初稿快速生成 20-30分钟 自动插入图表/公式 秒篇 …

作者头像 李华
网站建设 2026/9/3 1:51:03

过ACE检测-过反作弊引擎(CE句柄提权驱动)

25.过保护实现过TP保护ACE保护NP保护BE保护EAC保护-内存读写检测&#xff08;私有句柄表和全局句柄表的句柄提权&#xff09;-Windows驱动 上方链接过内存读写检测驱动、环境搭建、代码一条龙服务&#xff0c;以上驱动只能过内存读写也就是可以让CE的内存搜索功能正常工作&…

作者头像 李华