题目描述:
现有若干个会议,所有会议共享一个会议室,用数组表示每个会议的开始时间和结束时间,格式:[[会议 1 开始时间,会议 1 结束时间], [会议 2 开始时间,会议 2 结束时间]]。请计算会议室占用时间段。
输入描述:
[[会议 1 开始时间,会议 1 结束时间], [会议 2 开始时间,会议 2 结束时间]]
补充说明:
1. 会议室个数范围:[1, 100];
2. 会议室时间段:[1, 24];
输出描述:
[[会议开始时间,会议结束时间], [会议开始时间,会议结束时间]],输出格式与输入一致
示例1:
输入
[[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] 连续
C++源码:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
bool compare(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
vector<vector<int>> meetingTime(vector<vector<int>>& meetings) {
if (meetings.empty()) return {};
sort(meetings.begin(), meetings.end(), compare);
vector<vector<int>> mergedMeetings;
for (const auto& meeting : meetings) {
if (mergedMeetings.empty() || mergedMeetings.back()[1] < meeting[0]) {
mergedMeetings.push_back(meeting);
}
else {
mergedMeetings.back()[1] = max(mergedMeetings.back()[1], meeting[1]);
}
}
return mergedMeetings;
}
vector<vector<int>> parseInput(const string& input) {
vector<vector<int>> meetings;
vector<int > a,b,meeting;
stringstream ss(input);
string temp;
while (getline(ss, temp, ',')) {
temp.erase(remove(temp.begin(), temp.end(), '['), temp.end());
temp.erase(remove(temp.begin(), temp.end(), ']'), temp.end());
meeting.push_back(stoi(temp));
}
for (int i = 0; i < meeting.size(); i++)
{
if (i % 2 == 0) {
a.push_back(meeting[i]);
}
else {
b.push_back(meeting[i]);
}
}
for (int i = 0; i < a.size(); i++)
{
meetings.push_back({ a[i], b[i] });
}
return meetings;
}
int main() {
string input;
cin >> input;
vector<vector<int>> meetings = parseInput(input);
vector<vector<int>> result = meetingTime(meetings);
cout << "[" ;
for (const auto& interval : result) {
cout << "[" << interval[0] << ", " << interval[1] << "]";
}
cout << "]" << endl;
system("pause");
return 0;
}