数组-----找出数组中重复的数字

找出数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3}, 那么对应的输出是重复的数字2或者3。
方法:比较数字m是不是等于i,如果是,则接着扫描下一个数字;如果不是,则再拿它和第m个数字比较,如果它和第m个数字相等则找到了第一个重复的数字(该数字下标为m和i的位置都出现了);如果不相等,则把第i个数字和第m个数字互换,把m放到属于它位置上,再接着比较。总时间复杂度O(n),空间复杂度O(1);

#include <cstdio>
// 找出数组中重复的数字
// 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,
// 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},
// 那么对应的输出是重复的数字2或者3。
//方法:比较数字m是不是等于i,如果是,则接着扫描下一个数字;如果不是,则再拿它和第m个数字比较,如果它和第m个数字相等
//则找到了第一个重复的数字(该数字下标为m和i的位置都出现了);如果不相等,则把第i个数字和第m个数字互换,把m放到属于它
//位置上,再接着比较。
bool Test(int arr[], int length, int* a)
{
//判断输入是否有效
	if (arr == nullptr || length <= 0)
	{
		return false;
	}
	for (int i = 0;i < length;++i)
	{
//判断数组中数字大小是否越界
		if (arr[i]<0 || arr[i]>length - 1)
			return false;
	}
	for (int i = 0;i < length;++i)
	{
		while(arr[i]!=i)
		{
			if (arr[i] == arr[arr[i]])
			{
				*a = arr[i];
				return true;
			}
			else
			{
				int temp = arr[i];
				arr[i] = arr[temp];
				arr[temp] = temp;
			}
		}
	}
	return false;
}

void Test1()
{
	int a;
	int array1[] = { 0,1,2,3,3,4 };
	bool duplicated = Test(array1, sizeof(array1) / sizeof(array1[0]), &a);
	if (duplicated)
		printf("数字:%d 重复", a);
	else
		printf("没有数字重复");
	printf("\n");
}

void Test2()
{
	int a;
	int array2[] = { 0,1,2,3,4,5 };
	bool duplicated = Test(array2, sizeof(array2) / sizeof(array2[0]), &a);
	if (duplicated)
		printf("数字:%d 重复", a);
	else
		printf("没有数字重复");
	printf("\n");
}

void Test3()
{
	int a;
	int array3[] = { 0,1,1,2,2,3 };
	bool duplicated = Test(array3, sizeof(array3) / sizeof(array3[0]), &a);
	if (duplicated)
		printf("数字:%d 重复", a);
	else
		printf("没有数字重复");
	printf("\n");
}

void Test4()
{
	int a;
	int array4[] = { 0,1,2,3,4,6 };
	bool duplicated = Test(array4, sizeof(array4) / sizeof(array4[0]), &a);
	if (duplicated)
		printf("数字:%d 重复", a);
	else
		printf("没有数字重复");
	printf("\n");
}

int main()
{
	Test1();
	Test2();
	Test3();
	Test4();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39916039/article/details/82080358