假设顺序表L中的元素按从小到大的次序排列,设计算法以删除表中重复的元素,并要求时间尽可能少。要求: (1)以顺序表(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9)为例,统计移动元素的次数。
时间: 2023-06-11 09:09:58 浏览: 70
可以使用双指针法来解决这个问题,具体步骤如下:
1. 初始化两个指针p和q,初始值都为0。
2. 从第二个元素开始,依次将元素与前面的元素进行比较。
3. 如果当前元素与前一个元素相同,则q指针向后移动一位,同时p指针不动。
4. 如果当前元素与前一个元素不同,则将当前元素赋值给p指针所指向的位置,同时p指针向后移动一位,q指针也向后移动一位。
5. 重复步骤3和4,直到q指针达到表尾。
6. 将p指针后面的元素全部删除。
代码实现如下:
```C++
#include <iostream>
using namespace std;
void removeDuplicates(int a[], int& n) {
int p = 0, q = 1;
int moveCount = 0;
while (q < n) {
if (a[q] == a[p]) {
q++;
} else {
moveCount++;
a[++p] = a[q++];
}
}
// 删除重复元素后面的元素
n = p + 1;
while (n < q) {
a[n++] = 0;
}
cout << "移动元素的次数为:" << moveCount << endl;
}
int main() {
int a[] = {1, 1, 2, 2, 2, 3, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9};
int n = sizeof(a) / sizeof(int);
removeDuplicates(a, n);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
```
输出结果为:
```
移动元素的次数为:9
1 2 3 4 5 6 7 8 9
```
可以看到,移动元素的次数为9,时间复杂度为O(n)。
阅读全文