找出1001个数(区间1~1000)中重复出现的数(有两个相同)

来源:互联网 发布:淘宝发布宝贝没有反应 编辑:程序博客网 时间:2024/06/07 19:51
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
/*
假设你有一个用1001个整数组成的数组,这些整数是任意排列的,
但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现 两次外,
其他所有数字只出现一次。假设你只能对这个数组做一次处理,
用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,
那么你能找到不 用这种方式的算法吗?


我用的是交换查找,说不清楚,举个例子 数组a从1开始,浪费a[0]空间
10 8 5 9 1 7 2 3 6 4 1
第一次 a[1]=10 所以找到a[1]的元素所对应的位置并该位置的数和a[1]交换,并将a[1]置0
       变为4 8 5 9 1 7 2 3 6 0 1
第二次 a[1]=4  相同的处理方法
       变为9 8 5 0 1 7 2 3 6 0 1
第二次 a[1]=9 相同的处理方法
  变为6 8 5 0 1 7 2 3 0 0 1
第四次 a[1]=6 .......
       变为 7 8 5 0 1 0 2 3 0 0 1
第五次 a[1]=7 .......
  变为 2 8 5 0 1 0 0 3 0 0 1
第六次 a[1]=2
  变为8 0 5 0 1 0 0 3 0 0 1
第七次 a[1]=8
  变为3 0 5 0 1 0 0 0 0 0 1
第八次 a[1]=8
  变为5 0 0 0 1 0 0 0 0 0 1
第九次 a[1]=5
        变为0 0 0 0 0 0 0 0 0 0 1
第十次 因为a[1]=0;
        所以一直往后直到找到不为0的
a[11]=1和a[1]交换,a[1]位置为0,故已经出现过一次1,所以这是第2个1
故1出现了两次


O(n)情况
*/
int main(void)
{
int array[1002];
int x,flag=0,j;
srand(unsigned(time(NULL)));
array[1] = rand() % 1000+1;
for (int i = 2; i <= 1000; i++)
{
x = rand() % 1000+1;
for ( j = 1; j < i; j++)
{
if (x == array[j]) break;
}
if (j==i){
array[i] = x;
}
else {
i--;
}
}

array[1001] = rand() % 1000+1;
for (int i = 1; i <= 11; i++)
{
cout << array[i] << " ";
}
int temp1;
for (int i = 1; i <= 11; )
{
if (array[i] == 0)  i++;
else

temp1 = array[i];
array[i] = array[temp1];
if (array[temp1])  {
array[temp1] = 0;

}
else {
cout << "\n" <<temp1<< endl;
break;
}
if (array[i] == 0) i++; 
}
}
for (int i = 1; i <= 11; i++)
{
cout << array[i] << " ";
}
return 0;
}
0 0