题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
思路:要找到第一个重复的数字,我们可以借鉴哈希的思路,将数组中的值存储到与之下标相同的数组中,比如说a[1]=2,则将a[1]存储到a[2]中,如果下一次出现a[7]=2,则也想将a[7]存储到a[2]中,这时发现a[2]中存储的值与a[7]相同,即找到重复的值。
1.首先要比较a[i]的值是否等于i,如果等于则对a[i]不作操作,直接i++。
2.如果a[i]的值不等于i,那么首先查看a[i]的值是多少,假设是m,那么比较a[i]和a[m]的值是否相等,如果不相等,那么则将a[i]与a[m]的值交换,如果相等,那么,a[i]即为重复的数字。
画图解释一下,以数组{2, 3, 4, 1, 6, 8, 9, 0, 7, 1}为例
我们首先从i=0的位置开始,a[0]=2,0不等于2,这是我们再将a[0]的值与a[2]的值进行比较,发现不相等,则将二者的值交换,数组变成
重复上述过程,继续比较和交换
此时,应该是找到重复数字的最后一个步骤,我们再往下比较时会发现,a[0]=1=a[1],这是说明我们找到了重复元素
将a[0]=2与下标是2的数字比较一下,发现a[0]=a[2]是相同的。
插入代码:
#include<iostream>
#include<vector>
using namespace std;
int fun2(int *arr, int len)
{
int i = 0;
while (i<10)
{
if (arr[i] != i)
{
int dfg = 0;
int tmp = arr[i];
if (arr[tmp] == tmp)
{
cout << tmp << endl;
return tmp;
}
else
{
dfg = arr[tmp];
arr[tmp] = arr[i];
arr[i] = dfg;
}
}
else
{
i++;
}
}
cout << -1 << endl;
return -1;
}
int main()
{
int ch[10] = { 2, 3, 4, 1, 6, 8, 9, 0, 7, 1 };
fun2(ch, 10);
return 0;
}
显示结果: