【发布时间】:2016-11-03 07:01:28
【问题描述】:
我有一个类 Segment 和一个这样的段数组:
private static class Segment {
int number, type;
Segment(int number, int type) {
this.number = number;
this.type = type;
}
}
Segment[] points = new Segment[n];
points={(0,-1),(1,0),(5,1),(6,0),(6,-1),(10,1),(11,0)}
左边的元素是点的列表,右边的列表是点的类型:-1打开一个线段,1关闭一个线段,0与线段相交。 正如你所看到的,这个数组已经按照数字排序了,使用这个代码(它是一个改编的 selectionSort):
maxI 找到最大“数字”元素的索引
private static int maxI(Segment[] segments, int size){
int max=0;
for (int i=0; i< size;i++){
if(segments[i].number > segments[max].number ){
max=i;
}
}
return max;
}
//交换方法在index1和index2之间交换数组元素
private static void swap(Segment[] segments, int index1, int index2){
int temp1;
int temp2;
temp1 = segments[index1].number;
temp2 = segments[index1].type;
segments[index1].number=segments[index2].number;
segments[index1].type=segments[index2].type;
segments[index2].number=temp1;
segments[index2].type=temp2;
}
selectSort 是排序方法(因为 Arrays.sort 不适用于“segments”)
private static void selectSort(Segment[] segments) {
int MaxPos;
for (int i=segments.length-1;i>0;i--){
MaxPos = maxI(segments, i+1);
swap (segments, MaxPos, i);
}
}
原始输入是 2 个范围和 3 个交点:
Range 1: 0 5
Range 2: 6 10
Intersection points: 1 6 11
所以排序后,结果如上:
(0,-1),(1,0),(5,1),(6,0),(6,-1),(10,1),(11,0)
我尝试修改 maxI 方法,因此使用第二个 if 语句将 6,-1 放在 6,0 (-1
if (segments[i].number = segments[max].number && segments[i].type > segments[max].type)
但它会弄乱输出。由于输入是随机的,因此必须准备代码来对许多数字相等的测试用例进行排序。
我在这个主题上看到的最接近的问题是one made in C++,我刚刚学习 Java,所以我努力尝试理解 C++。我觉得答案很接近,但不确定我错过了什么。也许我使用了错误的数据结构。 在此之后,我只是遍历数组,添加类型的总和,所以如果一个数字通过 3 个范围的开头(x,-1),它是 -3,绝对 = 3,所以它与 3 个范围相交,这就是我的答案会需要的。
【问题讨论】:
标签: java algorithm sorting data-structures