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

来源:互联网 发布:知乎如何发问题 编辑:程序博客网 时间:2024/06/05 08:35

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


0 0
原创粉丝点击