📅  最后修改于: 2023-12-03 14:43:04.221000             🧑  作者: Mango
在编写Java程序时,常常需要对数组进行排序,以便更高效地对其进行操作。在进行排序时,我们通常需要找到数组中的重复元素。本文将介绍如何使用Java程序对排序数组中的最后一个重复元素进行查找。
最后一个重复元素指的是在已排序的数组中,最后一个连续出现的重复元素。例如,数组[1,2,2,3,4,4,4,5]中,最后一个重复元素为4。
我们可以设置两个指针p1和p2,分别指向数组的第一个元素和第二个元素。随后,在p1和p2之间移动指针,如果p1和p2指向的元素相等,那么继续向后移动p2,直到p2指向的元素不等于p1指向的元素为止。接着,将p1指向p2的位置,p2指向p1的下一位。重复上述过程,直到数组的末尾,最后返回p1指向的元素。由于我们的算法仅在移动指针时对数组进行了遍历,因此时间复杂度为O(n),空间复杂度为O(1),性能较优。
代码如下所示,我们使用了Java编程语言和Eclipse IDE工具进行编写、调试和测试。在代码中,我们定义了两个指针p1和p2,分别从第一个和第二个元素开始进行遍历。我们还定义了while循环,不断调用p1和p2中的元素,如果它们不相等,则将p2的值复制到p1的位置,并将p2向后移动一位。最后返回p1指向的元素即可。
public int lastDuplicate(int[] arr, int n) {
int p1 = 0, p2 = 1;
while (p2 < n) {
if (arr[p1] == arr[p2]) {
p1 = p2;
p2++;
} else {
p2++;
}
}
return arr[p1];
}
为了验证算法的正确性,我们编写了以下测试用例:
public static void main(String[] args) {
int[] arr1 = {1,2,2,3,4,4,4,5};
int[] arr2 = {1,2,3,4,4,4,4,4};
int[] arr3 = {1,2,3,4,5,6,7,8};
int[] arr4 = {};
Assert.assertEquals(lastDuplicate(arr1, 8), 4);
Assert.assertEquals(lastDuplicate(arr2, 8), 4);
Assert.assertEquals(lastDuplicate(arr3, 8), -1);
Assert.assertEquals(lastDuplicate(arr4, 0), -1);
}
测试结果如下所示,表明算法可以正确地查找数组中的最后一个重复元素。
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec