c++ 病句 今日头条面试题
试题描述:
为了提高文章质量,每一篇文章(假设全部都是英文)都会有m名编辑审核,每个编辑独立工作,会把觉得有问题的句子通过下标记录下来,比如[1,10],1表示病句的第一个字符,10表示病句的最后一个字符。也就是从1到10个字符组成的句子,是有问题的。
现在需要把多名编辑有问题的句子合并起来,送给总编辑进行最终的审核。比如编辑a指出的病句是[1,10],[32,45];b编辑指出的病句是[5,16],[78,94],那么[1,10]和[5,16]是有交叉的,可以合并成[1,16],[32,45],[78,94]。
输入:
编辑数量m,之后每行是每个编辑的标记的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。
输出:
合并后的下标集合,第一个和最后一个下标用英文逗号分隔,每组下标之间用分号分隔。返回结果是从小到大的递增排列。
输入示例:
3
1,10;32,45
78,94;5,16
80,100;200,220;16,32
输出示例:
1,45;78,100;200,220
其他:
对于100%的数据,1<=M<=1e3,句子下标不超过int范围,每个编辑记录的下标不超过1000组。
这道题和活动安排的区别就是活动安排是找不重合的区间,而这道题是要去找重合的点。
这道题的输入看似很麻烦,其实不然。
在提高输入速度是,这个问题也就迎刃而解了,只需要在scanf()中添加一个,就像scanf("%d,%d",&a[j].x,&a[j].y)一样。
十分的简单。
之后只需要用getchar()判断一下换行就行了,不知道的看(C++ 球迷)。
还有这道题需要一个bool operator<(const sentance&sentance2)const。
这是一个重载操作。
其他的就是结尾的输出了。
你可以把最后一组数据的起始变得很大,再判断一下,就可以像输入一样输出了。
注意:要使用sort排序,sort排序是由小到大排序的,而是swap是从大到小排序的,所以分别使用<和>排序的。
这也就是重载的意义了。
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<algorithm>
using namespace std;
int j;
struct sentance
{
int x;
int y;
bool operator<(const sentance&sentance2)const
{
return x<sentance2.x;
}
}a[1000002];
int main()
{
int n;
int k=0;
cin>>n;
for(int i=0;i<n;i++)
{
while(scanf("%d,%d",&a[j].x,&a[j].y))
{
j++;
k++;
if(getchar()!=';')break;
}
}
sort(a,a+k);
int flag=0;
a[k].x=0x7ffffff;
for(int i=0;i<k;i++)
{
if(a[i].y>=a[i+1].x)
{
a[i+1].x=a[i].x;
a[i+1].y=max(a[i+1].y,a[i].y);
}
else
{
if(i==k-1)printf("%d,%d",a[i].x,a[i].y);
else printf("%d,%d;",a[i].x,a[i].y);
}
}
return 0;
}
浙公网安备 33010602011771号