题目一:找出数组中重复的数字
- 在一个长度为n的数组里的所有数字都在0~n-1的范围内。
- 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
- 请找出数组中任意一个重复的数字。
- 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是重复的数字2或3
#include<stdio.h>
#include<stdlib.h>
int FindRepeatNum(int *i_nums, int i_numsSize);
int main()
{
//int i_nums[] = {2,3,1,0,2,5,3};
int i_nums[] = {1,5,4,3,6,3,2};
int i_numsSize = sizeof(i_nums)/sizeof(i_nums[0]); //求数组元素个数
int i_repeatNum = FindRepeatNum(i_nums,i_numsSize);
printf("%d ",i_repeatNum);
return 0;
}
int FindRepeatNum(int *i_nums, int i_numsSize)
{
int tmp, i; //交换
if(i_nums == NULL || i_numsSize <= 0)
return -1;
for( i=0; i < i_numsSize; i++ )
{
while( i_nums[i] != i ) //若下标值与对应元素不相等,则交换
{
if( i_nums[i] == i_nums[i_nums[i]] ) //找到重复值
return i_nums[i];
tmp = i_nums[i_nums[i]];
i_nums[i_nums[i]] = i_nums[i];
i_nums[i] = tmp;
}
}
return -1; //无重复元素
}
题目二:不修改数组找出重复的数字
- 在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。
- 请找出数组中任意一个重复的数字,但不能修改输入的数组。
- 例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3
#include<stdio.h>
#include<stdlib.h>
int FindRepeatNum(int *i_nums, int i_numsSize);
int main()
{
//int i_nums[] = {2,3,1,0,2,5,3};
int i_nums[] = {1,5,4,3,6,3,2};
int i_numsSize = sizeof(i_nums)/sizeof(i_nums[0]); //求数组元素个数
int i_repeatNum = FindRepeatNum(i_nums,i_numsSize);
printf("%d ",i_repeatNum);
return 0;
}
int FindRepeatNum(int *i_nums, int i_numsSize)
{
int i_tmpnums[i_numsSize+1]; //再开辟一数组空间,将原数组的内容按下标放入此数组中
int i;
if(i_nums == NULL || i_numsSize <= 0)
return -1;
for( i=0; i < i_numsSize; i++ )
{
if( i_tmpnums[i_nums[i]] != i_nums[i] )
i_tmpnums[i_nums[i]] = i_nums[i];
else
return i_nums[i]; //相等 直接返回
}
return -1;
}