#include <iostream>
/*
面试题3:数组中重复的数字:
问题: 长为n的数组,每个元素大小都在0到n-1之间,请找出其中重复的数字
解决: 1. 排序o(nlogn)
2. 用哈希表,哈希函数将键key映射为数组下标o(n),空间复杂度(n)
3. 没有重复且排好序时,下标和值应该是相等的,所以扫描数组:
当该处的值不在其位时,把它放到它应在的位置上
当该处的值在其位时,扫描下一个元素
一句话:把不再其位的值放到它应在的位置上
*/
using namespace std;
const int MAX = 1000;
int array_n[MAX];
int n;
int main(void)
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> array_n[i];
int i=0;
bool find_duplicates = false;
int duplicates = 0;
while(true)
{
if(i == n)
break;
// 在其位时,扫描下一个元素
if (array_n[i] == i)
i++;
else
{
// 交换位置前查重
if (array_n[array_n[i]] == array_n[i])
{
find_duplicates = true;
duplicates = array_n[i];
break;
}
else
{
// 不在其位时,把它放到它应在的位置上
int temp = array_n[array_n[i]];
array_n[array_n[i]] = array_n[i];
array_n[i] = temp;
}
}
}
if (find_duplicates) cout << duplicates;
else cout << "not find";
return 0;
}