题目要求:
一条直线上有N条线段,已知它们的两个端点,请完成以下代码(两种语言任挑其一),计算这些线段共覆盖了多大的长度(被多条线段覆盖的部分职能计算一次)。
Segment:{[1,9],[5,10]} Sum = 9;
Segment:{[1,3],[10,15]} Sum = 7;
Segment:{[1,3],[2,5],[10,15]} Sum = 9;
C/C++
struct Segment
{
int start;
int end;
}
int Sum(int n,Segment * segments) // n是segments包含的元素个数
还有Java语言,我在这里使用C++所以就不写其组成了。
实现代码:
#include <iostream>
using namespace std;
struct Segment
{
int start;
int end;
Segment() //Segment 的默认构造函数
{}
};
int Sum(int n, Segment* segments)
{
int i = 1;
int sum = 0;
for (i = 1; i < n; i++) //将其全部循环一遍
{
if ((segments[i].end < segments[i - 1].end) && (segments[i].start > segments[i - 1].start))//对应第一种情况,即线段2被线段1包含
{
segments[i].start = segments[i-1].start;//将线段2的长度置为线段1的长度,然后将线段1置为0,以便后面进行总和相加
segments[i].end = segments[i-1].end;
segments[i-1].start = 0;
segments[i - 1].end = 0;
}
if ((segments[i].end > segments[i - 1].end) && (segments[i].start < segments[i - 1].start))//对应第二种情况,线段1被线段2包含
{
segments[i - 1].start = 0; //将线段1置为0 以便后面相加
segments[i - 1].end = 0;
}
if ((segments[i].start > segments[i - 1].start) && (segments[i].end > segments[i - 1].end) && (segments[i].start < segments[i - 1].end))//对应第三种情况,线段1在前,线段2在后,两个线段有交叉
{
segments[i].start = segments[i - 1].start; //将线段2 的长度赋为线段1和2除去交叉长度的总长度
segments[i - 1].start = 0; //将线段1 置为0
segments[i - 1].end = 0;
}
if ((segments[i].start < segments[i - 1].start) && (segments[i].end < segments[i - 1].end) && (segments[i].end > segments[i - 1].start))//对应第四种情况,线段2在前,线段1在后,两个线段有交叉
{
segments[i].end = segments[i - 1].end; //将线段2的长度置为线段1和2除去交叉长度的总长度
segments[i - 1].start = 0; //将线段1 置为0
segments[i - 1].end = 0;
}
if ((segments[i].start < segments[i - 1].end) || (segments[i].end < segments[i - 1].start))//线段1和线段2不交叉,线段1在前或者线段2在前。
{
continue;
}
}
for (i = 0; i < n; i++)
{
sum = sum + (segments[i].end - segments[i].start);//将线段进行相加。
}
return sum;
}
void test()
{
Segment *segments = new Segment[3];
segments[0].start = 1;
segments[0].end = 3;
segments[1].start = 2;
segments[1].end = 5;
segments[2].start = 10;
segments[2].end = 15;
cout << Sum(2, segments) << endl;
delete[]segments;
}
int main()
{
test();
return 0;
}
经过我的测试,题目提供的三组测试用例均以通过,我自己还设计了几组测试用例,也均通过,所以程序基本没有什么问题了。