news 2026/3/23 1:38:59

(新卷,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/3/21 12:43:54

1.4 用数据挖掘的视角重新理解生成式AI

1.4 用数据挖掘的视角重新理解生成式AI:为什么GPT能"思考"? 引言 ChatGPT能写代码、回答问题、创作文章,看起来像在"思考"。但作为数据挖掘师,我们需要从更深层次理解:GPT的"思考"本质是什么?它和数据挖掘有什么关系?本文将从数据挖掘的…

作者头像 李华
网站建设 2026/3/22 19:10:00

1.8 金融行业数据决策全解析:8大核心场景从理论到实战

1.8 金融行业数据决策全解析:8大核心场景从理论到实战 引言 金融行业是数据驱动决策的典型代表。从风险控制到精准营销,从反欺诈到智能定价,数据挖掘在金融领域的应用无处不在。本文将深入解析金融行业的8大核心数据决策场景,带你从理论到实战,全面掌握金融数据挖掘。 …

作者头像 李华
网站建设 2026/3/13 7:49:55

1.19 OSM模型实战:目标-策略-指标,搭建可落地的数据指标体系

1.19 OSM模型实战:目标-策略-指标,搭建可落地的数据指标体系 引言 OSM模型(Objective-Strategy-Metric)是构建数据指标体系的有效方法。通过明确目标、制定策略、定义指标,可以搭建可落地的数据指标体系。本文将深入解析OSM模型,并通过实战案例,教你如何应用OSM模型构…

作者头像 李华
网站建设 2026/3/21 18:36:42

【毕业设计】基于人工智能迁移学习的睡意检测报警系统

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

作者头像 李华
网站建设 2026/3/13 2:37:10

Linux内核进程管理子系统有什么第九十一回 —— 进程调度(18)

接前一篇文章:Linux内核进程管理子系统有什么第九十回 —— 进程调度(17) 上一回讲解了Linux内核中调度类结构struct sched_class的定义及各成员的意义。本回开始,依次对于各个调度类(fair_sched_class、rt_sched_class、dl_sched_class、idle_sched_class和stop_sched_cl…

作者头像 李华
网站建设 2026/3/11 14:42:36

强烈安利9个AI论文平台,专科生毕业论文写作必备!

强烈安利9个AI论文平台&#xff0c;专科生毕业论文写作必备&#xff01; AI 工具让论文写作不再难 在当今这个信息爆炸的时代&#xff0c;专科生的毕业论文写作正面临着前所未有的挑战。从选题到撰写&#xff0c;再到查重和修改&#xff0c;每一步都可能成为压垮学生的最后一根…

作者头像 李华