这是一个我遇到的一个面试题目,当时时间紧迫,没有回答上来,不免是一个遗憾。后来回去后想着用数学的方法,可是把个数缩减到1-4几个数,在其和上没有找到规律,呈随机状态:
重复数为4:
4 2 3 4:13
1 4 3 4:12
1 2 4 4:11
重复数为3:
3 2 3 4:12
1 3 3 4:11
1 2 3 3:9
…略
由此看来这个数具有双随机性:本身随机(0-999),其重复数占取的另一个数也具有随机性,由此作罢。
反复琢磨,发现1000个数,0-999,不正好对应1000个数的数组与数组的下标吗。假如把这些数字输入一个1000个数的数组,其位置为该数字对应的数组下标,a[value]=value,这样,当第二次输入同样的数字时,通过检验该a[value]是否已被赋值而定位出这个重复的数字。过程如下:
(1) 产生随机数组int random[1000],值(value)从0-999随机,且只有2个值是相同的;
(2) int a[1000],赋值每一个元素为-1;
(3) int i=0;
while(i<1000)
{
if ( a[ (random[i]) ] != -1)
print(random[i]); //打印出这个值
a[ (random] ] = random[i];
i++;
}
源代码如下(加入了排序和未排序的对比):
//<centos/c>
#include<stdio.h>
#include<time.h> //in order to get a seed
void print(int a[],int len) // print from end to begin!
{
while(len>0)
{
printf("%d ",a[len-1]);
if( ((len-1)%20) == 0)
printf("\n");
len--;
}
printf("\n Print Array over! \n");
}
void setValue(int *p,int len,int value) //init array with one value
{
while(len>0)
{
*(p+len-1)=value;
len--;
}
}
int checkExist(int* p,int len,int value) //check if the number already exist
{
while(len > 0)
{
if( (*(p+len-1))== value )
return 1;
len--;
}
return 0;
}
void makeArray(int a[],int len) //make a random array with special quest: number from 0 to 999,only 2 numbers are equal,the rest are unique
{
int i=0,m;
srand((int)time(0));
while (i<len)
{
m = rand() % 1000;
if( (checkExist(a,i,m)==0) && (i<(len-1)) )
{
a[i]=m;
//printf("a[%d] =%d m= %d \n",i,m,m);
i++;
}
if((i > (len-2)) && checkExist(a,i,m)) //make the repetitive number
{
a[i]=m;
i++;
}
}
printf("Array make finished!\n");
print(a,len);
}
void swap(int*,int*);
void bubbleSort(int a[],int len) //Bubble Sort
{
int flag=0,i;
for(;len>1;len--)
{
for(i=0;i<len-1;i++)
{
if(a[i]>a[i+1])
{
swap(&a[i],&a[i+1]);
flag = 1;
}
}
if (flag == 0)
break;
flag =0;
}
}
void swap(int* q,int *p)
{
int i=*q;
*q=*p;
*p=i;
}
void find(int* p,int len,int value) //for program check
{
int count=0;
while(len>0)
{
if( *(p+len-1) == value)
count++;
len--;
}
printf("This number show %d times!\n",count);
}
void answer(int a[]) //one circle make the answer
{
int compare[1000];
setValue(compare,1000,-1);
int i=0;
while(i<1000)
{
if(compare[(a[i])] != -1)
printf("This Double number is %d !!!\n",a[i]);
compare[(a[i])]=a[i];
i++;
}
}
int main(void)
{
int randArray[1000];
makeArray(randArray,1000);
answer(randArray);
bubbleSort(randArray,1000);
print(randArray,1000);
answer(randArray);
//print(compare,1000);
return 0;
}