我很难理解在这个算法中如何复制数组。我很好用代码,直到我到达如下所示的第12行。这段代码来自我目前正在研究的一本书。 我只想了解如何在每场比赛中进行复制
写了一些值来模拟场景
a = [10,4,6,10,5,2]
a[0] = a[3] MATCH occurs when j=3
arraycopy(a, 4, a, 3, (5-3)) // Variable values substituted into arraycopy. (pretty sure they're correct)
System.arraycopy(a, j+1, a, 0, n-j); // Line 12
整个代码:
int n = a.length;
if (n < 2){
System.out.println("no duplicates");
}
for (int i = 0; i< n-1; i++)
for (int j = i + 1; j < n; j++ )
if(a[i] == a[j]){
--n;
System.arraycopy(a, j+1, a, 0, n-j); // Line 12
--j;
System.out.println();
}
int[] aa = new int[n];
System.arraycopy(a, 0, aa, 0, n);
仅仅为了记录,我理解第二个arraycopy语句,因为它只是一个简单的复制到数组aa。
我知道有很多关于SO的阵列复制问题,但我遇到的问题没有回答这个具体问题,因为我需要逐步了解复制如何匹配匹配。
无论如何,先谢谢你们。
答案 0 :(得分:3)
我很确定算法中存在错误,因为第一个数组副本会覆盖数组前面的好数据。我认为该行应该是:
System.arraycopy(a, j+1, a, j, n-j); // Line 12
这会将数组的末尾移到一个上,只覆盖刚找到的一个副本。
现在,它的工作原理如下:
Before copy:
i j n
[1, 2, 3, 4, 1, 5, 6]
\ /
n-j
After copy:
i j n
[5, 6, 3, 4, 1, 5, 6]
显然是错的。现在有更多重复项比我们开始时重复了!
使用更新的行,它看起来像这样:
After copy:
i j n
[1, 2, 3, 4, 5, 6, 6]
好多了。副本1消失了。
作为补充说明,这是消除数组重复的非常可怕的方法。 所有重复的数组将执行(n *(n - 1)/ 2)个元素副本,这是荒谬的。重复数组的标准简单方法通常是将每个元素添加到HashSet
,然后将该集合的内容迭代到新数组中。