找出重复的整数

在一个给定的数型组中,找出重复的整数:

比如int array[5] = {1,1,3,3,4,5,6}重复的整数是1 ,3。

我的想法,先对数组进行排序,使数组处于有序状态,这样一来就容易判断重复的数字。我的判断方法是:用两个指针分别指向两个数字,比如用current指针指向第一个数字1next指针指向第二个数字1,如果current指向的数字等于next指向的数字说明有重复的数字,然后让next指针下移一个数字,指向第三个数字,然后再判断current与next是否相等,如果相等,让next继续下移,直到curr指向的值不等于next指向的值,然后next-1对应的数字一定是重复的,然后让current=next,next=current+1,进入下一次循环判断。如果是连续的两个数字比如current指向第5个数字是4,next指向第6个数字是5,此时虽然next指向的值不等于current指向的值,但显然没有重复的值,所以还应该加个判断如果他们相邻且不相等,让他们两个指针都下移,然后进入下一次循环判断。算法介绍得差不多了,下来咱就让代码说话吧。

快速排序算法:参考了数据结构(c语言版)  严蔚敏 吴伟民 编著 清华大学出版社

 

#include "iostream"
using namespace std;

int Partition(int array[], int low, int high)
{
	int pivotkey = array[low];

	while (low < high)
	{
		while ((low < high) && (array[high] >= pivotkey))
		{
			high--;
		}
		array[low] = array[high];

		while ((low < high) && (array[low] <= pivotkey))
		{
			low++;
		}
		array[high] = array[low];
	}

	array[low] = pivotkey;
	return low;
}

void QuickSort(int array[], int low, int high)
{
	if (low < high)
	{
		int pivot = Partition(array, low, high);
		QuickSort(array, low, pivot-1);
		QuickSort(array, pivot+1, high);
	}
}

void FindDifferentNum(int array[], int lenthOfArray)
{
	int current = 0;
	int next = 1;
	
	for (int i=0; i<lenthOfArray-1; i++)
	{
		if (array[current] == array[next])
		{
			next++;
			continue;
		}
		else if (next-current > 1) // 两个数字不相等而且不相邻,那么array[current]==array[next-1]
		{                          // 所以把array[next-1]打印出
			cout << array[next-1] << "  ";
			current = next;
			next++;
		}
		else // 两个数字不相等而且相邻的情况
		{
			current = next;
			next++;
		}
	}
	
	if (current != lenthOfArray-1) 
	{
		cout << array[current] << endl;
	}
	
}




void main(){
	int array[10] = {3, 3, 2, 1, 9, 9, 6, 5, 10, 10};
	cout << "数组中的原始数字是:" << endl;
	for (int i=0; i<10; i++)
	{
		cout << array[i] << "  ";
	}
	cout << endl;

	QuickSort(array, 0, 9);

	cout << "排序后的结果是:" << endl;
	for (i=0; i<10; i++)
	{
		cout << array[i] << "  ";
	}
	cout << endl;

	cout << "数组中重复的数字是" << endl;
	FindDifferentNum(array, sizeof(array)/sizeof(int));	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值