东华大学上机题——去掉数组中相同元素

东华大学上机题——去掉数组中相同元素

题目描述:
在一个递增有序的数组中,有数值相同的元素存在,程序的功能是去掉数值相同的元素,使数组中不再有重复的元素。例如(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;
}

运行测试结果:
在这里插入图片描述

发布了54 篇原创文章 · 获赞 54 · 访问量 3073

猜你喜欢

转载自blog.csdn.net/weixin_45295612/article/details/105407735