📅  最后修改于: 2023-12-03 15:42:16.580000             🧑  作者: Mango
这是 GATE 计算机科学与工程考试 2007 年的第 85 题,考察的是程序设计能力。
假设你有一个整型数组 $a_{1..n}$,你需要写出一个程序,找到所有的 $a_i=a_{i+2}$ 的元素并将它们删除。删除操作后,需要将数组中的所有元素向左移动 $i$ 个位置;如果数组右边没有元素了,那么就将数组后面的位置赋值为 $-1$。
编写一个函数 int[] removeElements(int[] arr)
,接收参数为一个整型数组,并返回删除操作后的新数组。请注意,你需要保持数组中元素的顺序。
你需要在 $O(n)$ 的时间复杂度内完成这个函数。此外,你不能使用额外的数据结构,如队列或堆栈,也不能使用任何现有的库函数。
arr = [1,2,3,2,3,4,5,6,5,4,3,2,1]
[1,4,5,6,-1,-1,-1,-1,-1,-1,-1,-1,-1]
由于题目要求不能使用额外的数据结构,如队列或堆栈,那么我们需要遍历整个数组,寻找相邻的两个元素是否相等。如果相等,就将这个元素删除。
那么如何删除元素呢?我们可以使用一个指针指向数组开头,遍历整个数组,遇到需要删除的元素就将指针右移一位,直到找到下一个不需要删除的元素,将指针对应的位置赋值为这个元素的值。
在删除元素过程中,我们还需要记录每次需要删除的元素数量 $k$,以及数组中最后一个元素的位置 $last$。删除操作完成后,我们将数组中所有的元素向左移动 $k$ 位,最后将数组中 $last-k$ 个位置赋值为 $-1$。
public static int[] removeElements(int[] arr) {
int n = arr.length;
int k = 0;
int last = -1;
// 删除相邻元素
for (int i = 0; i < n - 2; i++) {
if (arr[i] == arr[i+2]) {
k++;
} else {
arr[i-k+1] = arr[i+2];
}
}
// 移动元素并赋值-1
for (int i = n-k-1; i >= n-2*k-1; i--) {
if (i > last) {
arr[i] = arr[i+k];
} else {
arr[i] = -1;
}
}
return arr;
}
这段代码的时间复杂度为 $O(n)$,可以通过本题。