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;
}

猜你喜欢

转载自www.cnblogs.com/FXY-180/p/9492262.html
今日推荐