有1000个数,范围在0-999中,有且仅有两个相同数,用一次遍历查找出来

这是一个我遇到的一个面试题目,当时时间紧迫,没有回答上来,不免是一个遗憾。后来回去后想着用数学的方法,可是把个数缩减到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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值