题目描述
用x,y表示一个整数范围区间,现在输入一组这样的范围区间(用空格隔开),请输出这些区间的合并。
输入描述:
一行整数,多个区间用空格隔开。区间的逗号是英文字符。
输出描述:
合并后的区间,用过空格隔开,行末无空格
示例1
输入
1,3 2,5
输出
1,5
说明
示例2
输入
1,3 2,5 8,10 11,15
输出
1,5 8,10 11,15
说明
备注:
x,y均为正整数,并且x<=y。
这道题就是前面Leetcode改变来的,输入的有点特殊,可以先用C++ getline函数读入一行string,再用istringstream从字符串中提取出要的数据。这里可以使用pair这种数据结构来辅助。
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
vector<PII> merge(vector<PII>& intervals) {
vector<PII> res;
if (intervals.size() == 0)
return res;
// 先按区间起点排序,再合并重叠的区间
sort(intervals.begin(), intervals.end());
int last_start, last_end; // 上一个区间的起点和终点
for (int i = 0; i < intervals.size(); i++) {
if (i == 0) {
last_start = intervals[0].first;
last_end = intervals[0].second;
}
else {
if (intervals[i].first > last_end) {
res.push_back({last_start, last_end});
last_start = intervals[i].first;
last_end = intervals[i].second;
}
else if (intervals[i].second > last_end) {
last_end = intervals[i].second;
}
}
}
res.push_back({last_start, last_end});
return res;
}
int main()
{
string line;
int a, b;
char temp;
getline(cin, line);
vector<PII> intervals;
istringstream ssin(line);
while (ssin >> a>> temp >> b) {
intervals.push_back({ a, b });
}
vector<PII> res;
res = merge(intervals);
cout << res[0].first << "," << res[0].second;
for (int i = 1; i < res.size(); i++) {
cout << " " << res[i].first << "," << res[i].second;
}
cout << endl;
}