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[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