东华大学上机题——去掉数组中相同元素
题目描述:
在一个递增有序的数组中,有数值相同的元素存在,程序的功能是去掉数值相同的元素,使数组中不再有重复的元素。例如(7,10,10,21,30,42,42,42,51)变成(7,10,21,30,42,51)。
法一:
先确定该数组为递增有序。那么只需要比较相邻两个元素即可。这里可以采用直接插入排序的思想,若插入的一个元素在数组中存在,则不插入。采用直接排序的思想,其时间复杂度为o(n^2),空间复杂度为o(1)。
#include<iostream>
using namespace std;
void sort(int num[], int n) {
int temp;
for (int i = 0;i < n - 1;i++) {
for (int j = 0;j < n - i - 1;j++) {
if (num[j] > num[j + 1]) {
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}
void deletSame(int num[], int n) {
sort(num, n);
int i, j;
for (i = 0, j = 1;j < n;j++) {
if (num[i] != num[j]) {
num[++i] = num[j];
}
}
for (int k = 0;k < (i + 1);k++)
cout << num[k] << " ";
}
int main() {
int n;
cout << "输入数字个数:";
cin >> n;
int* num = new int[n];
cout << "输入数组:";
for (int i = 0;i < n;i++)
cin >> num[i];
deletSame(num, n);
return 0;
}
运行测试结果:
法二:
另一种思考方式是设计一个辅助数组,设计两个指针i,j分别指向原数组和辅助数组,比较原数组中的值和辅助数组中的值,若相同,则i++,否则将数据插入到辅助数组中,两个指针同时后移,直到遍历完原数组。采用增加一个辅助数组的方法,时间复杂度为o(n),空间复杂度为o(n)。
#include<iostream>
using namespace std;
void sort(int num[], int n) {
int temp;
for (int i = 0;i < n - 1;i++) {
for (int j = 0;j < n - i - 1;j++) {
if (num[j] > num[j + 1]) {
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}
void deletSame(int num[], int n) {
sort(num, n);
int i, j;
int* fuzhu = new int[n];
fuzhu[0] = num[0];
for (i = 1, j = 0;i < n;i++) {
if (num[i] != fuzhu[j]) {
j++;
fuzhu[j] = num[i];
}
}
for (int k = 0;k <= j;k++)
cout << fuzhu[k] << " ";
}
int main() {
int n;
cout << "输入数字个数:";
cin >> n;
int* num = new int[n];
cout << "输入数组:";
for (int i = 0;i < n;i++)
cin >> num[i];
deletSame(num, n);
return 0;
}
运行测试结果: