【小米校招笔试】给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次

2016年小米校招笔试第一题(西安站)

给定一些线段,线段有起点和终点,求这些线段的覆盖长度,重复的部分只计算一次。

参考解法(Java版):

package XiaoMi;

/********************************************************
 * 算法思想:将长线段细分为长度为1的小段,用布尔数组记录每一个小段;
 * 遍历所有长段,如果有覆盖则在数组中把该索引处的布尔值标记为ture;
 * 最后,遍历布尔数组中所有值为ture的小段个数,即为所求总覆盖长度。
 * ******************************************************/
public class test13 {
	// 指定线段中点的最大范围
	private final static int N = 99999;
	// 布尔数组用来记录已覆盖小段
	private static boolean b[];
	// 定义线段的数据结构
	class XianDuan {
		int start;  //线段起点
		int end;    //线段终点
	}
	
	// 遍历布尔数组求总覆盖长度
	static int sum(XianDuan[] xd) {
		b = new boolean[N];

		int start = 0;
		int end = 0;

		// 标记过程
		for (int i = 0; i < xd.length; i++) {
			for (int j = xd[i].start; j < xd[i].end; j++) {
				b[j] = true;
				//System.out.println("置为true");
			}
			// 找到boolean数组索引的最大值
			if (xd[i].end > end) {
				end = xd[i].end;
			}
			// 找到boolean数组索引的最小值
			if (xd[i].start < start) {
				start = xd[i].start;
			}
		}
		// 统计过程
		int count = 0;
		for (int i = start; i < end; i++) {
			if (b[i]) {
				count++;
			}
		}	
		return count;
	}

	public static void main(String[] args) {
		/*
		 * A a = new A(); A.B b = a.new B(); //内部类实例化
		 */
		test13 tt = new test13();
		test13.XianDuan x1 = tt.new XianDuan();
		x1.start = 1;
		x1.end = 3;

		test13.XianDuan x2 = tt.new XianDuan();
		x2.start = 2;
		x2.end = 6;

		test13.XianDuan x3 = tt.new XianDuan();
		x3.start = 11;
		x3.end = 12;

		test13.XianDuan x4 = tt.new XianDuan();
		x3.start = 10;
		x3.end = 14;

		XianDuan xx[] = { x1, x2, x3, x4 };
		System.out.println(sum(xx));
	}
}

运行结果:

9


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值