小米2015校园招聘西安站

题目要求:

一条直线上有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;
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值