Java 在不为第二个数组分配空间的情况下就地从已排序数组中删除重复项
我的任务是解决一个复杂的问题。我试图将包含重复项的未排序数组转换为不包含重复项的已排序数组。我使用选择排序来完成第一部分:Java 在不为第二个数组分配空间的情况下就地从已排序数组中删除重复项,java,sorting,duplicates,Java,Sorting,Duplicates,我的任务是解决一个复杂的问题。我试图将包含重复项的未排序数组转换为不包含重复项的已排序数组。我使用选择排序来完成第一部分: public static void SelectionSort(int [] list) { int i = 0; int j = 0; int indexSmallest = 0; int temp = 0; for (i = 0; i < list.length - 1; i++
public static void SelectionSort(int [] list) {
int i = 0;
int j = 0;
int indexSmallest = 0;
int temp = 0;
for (i = 0; i < list.length - 1; i++) {
indexSmallest = i;
for (j = i + 1; j < list.length; j++) {
if (list[j] < list[indexSmallest]) {
indexSmallest = j;
}
}
temp = list[i];
list[i] = list[indexSmallest];
list[indexSmallest] = temp;
}
}
publicstaticvoidselectionsort(int[]列表){
int i=0;
int j=0;
int indexSmallest=0;
内部温度=0;
对于(i=0;i
排序不是问题-我很难从数组中删除重复项。我脑海中的解决方案是创建一个辅助数组,并迭代输入以检查第二个数组中是否存在该元素,如果不存在,则将其添加到数组中。我被卡住了,因为我无法创建另一个数组。那么,有什么好处呢?如果我不能创建一个数组来交叉引用并检查我是否有唯一的值,如何解决这个问题?我无法使用任何内置Java函数。不需要第二个数组。。。这样想吧 最简单的方法是将其转换为set/hashset,然后在数组中对其排序 但是,如果这组是禁止的,唯一的可能是把重复的放在最后,把它们剪下来,然后把其余的分类
[1,8,1,2,3,5,3]
在此数组中,您需要删除重复的元素。。。可以那么如果我们做了这样的事情。。。我们将此数组“拆分”为“已排序”、“未排序和重复”和“重复”。现在我们要做的是使用2个指针遍历数组。第一个元素(我们称它为“i”)和最后一个元素(我们称它为“j”)。。。现在我们将在i,每次我们都会交换,当我们找到一个副本时。这样,您将获得在“i”
之前不重复的所有内容,以及在“i”
之后重复的所有内容。。。现在,您将从index0
do indexi
对数组进行排序,您应该已经对数组进行了排序,并且您将只删除重复的数组
ofc.,这需要时间复杂度,才能处理O(n*logn)/O(n^2)
有一种方法可以在O(n)中实现,这可以通过。。您将使用2个指针
一个将指向当前排序的数组,在那个里你们并没有重复项,另一个将指向一个地方,那个里还有未交换的整数。。。(您需要记住找到的最大数字)
更具体地说:
[1,2,2,3,3,4,5]
i = 0, j = 1
- fine
i = 1, j = 2
- duplicate ... soo ..
jumping to duplicate position
i = 2, j = 3 (array[3] != 2, so we will swap)
current array -> [1,2,3,2,3,4,5]
^ ^
i j
i = 3, j = 4
- highest_number > 3 is not true (2 < 3), so skipping
i = 3, j = 5
- highest_number > 3 is not true (3 < 3), so skipping
i = 3, j = 6
- swapping
... etc
and you should end up with something like this
[1,2,3,4,5,2,3]
^ ^
i j
now you can cut the array at i, so you will get `[1,2,3,4,5,\0]` (in C syntax) ... so basically `[1,2,3,4,5]`
[1,2,2,3,3,4,5]
i=0,j=1
-好的
i=1,j=2
-复制。。。苏。。
跳转到重复位置
i=2,j=3(数组[3]!=2,所以我们将交换)
当前数组->[1,2,3,2,3,4,5]
^ ^
i j
i=3,j=4
-最高_数>3为非真(2<3),因此跳过
i=3,j=5
-最高_数>3为非真(3<3),因此跳过
i=3,j=6
-交换
... 等
你应该以这样的方式结束
[1,2,3,4,5,2,3]
^ ^
i j
现在您可以在i处剪切数组,因此您将得到“[1,2,3,4,5,0]”(C语法)。。。所以基本上,“[1,2,3,4,5]`