小米2015校园招聘西安站

来源:互联网 发布:苏东坡美食家知乎 编辑:程序博客网 时间:2024/06/11 09:48

题目要求:

一条直线上有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 置为0segments[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 置为0segments[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;}

经过我的测试,题目提供的三组测试用例均以通过,我自己还设计了几组测试用例,也均通过,所以程序基本没有什么问题了。

0 0
原创粉丝点击