找出数组中重复的数字
题目:在一个长度为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;
}