[编程题]合并区间-迅雷

牛客网:https://www.nowcoder.com/questionTerminal/0596b6232ce74b18b60ba0367d7f2492

[编程题]合并区间

用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排序,剩下的就很简单了
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
#include<iterator>
using namespace std;
int main()
{
    string ch;
    char a;
    int x, y;
    vector<pair<int, int > > xy,ans;
    while (getline(cin, ch))//看题意还以为要处理下,其实直接读就行,做麻烦了
    {
        xy.clear();
        ans.clear();
        stringstream strcin(ch);
        while (strcin >> x >> a >> y)
        {
            if (x > y)swap(x, y);
            xy.emplace_back(x,y);
        }
        stable_sort(xy.begin(), xy.end());
        ans.push_back(*xy.begin());
        auto an = ans.begin();
        for (auto it = xy.begin()+1; it != xy.end(); it++)
        {
                if (an->second >= it->first  )
                {
                    an->second = max(an->second, it->second);
                }
                else if(an==ans.end()-1)
                {
                    ans.push_back(*it);
                    an = ans.end()-1;
                }
        }
        for (auto &key : ans)
        {

            cout << key.first << "," << key.second;
            if (key != *an) cout << ' ';
            else cout << endl;

        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值