您的位置:首页 > 其它

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

2015-10-10 14:02 579 查看
2016年小米校招笔试第一题(西安站)

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

参考解法(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
;

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: