寻找发帖“水王”的扩展问题

#include<stdio.h>

#include<stdlib.h>

/*

  在一个论坛,发现有三个发帖很多的Id ,他们发帖的总数都超过了总数的1/4 ,编程快速的找到这三个id 

  算法: 每次删除是个不同的Id ,那么最后剩下的 三个Id 就是所求的id 

*/

void findThreeK(int* p,int length)

{

     int candidate[3],nTimes[3]={0,0,0},i;

     

     for(i=0;i<length; i++)

     {

       if(p[i]==candidate[0])  

       {

         nTimes[0]++;

       }

       else if(p[i]==candidate[1])

       {

         nTimes[1]++;

       }

       else if(p[i]==candidate[2])

       {

         nTimes[2]++;

       }

       else if(nTimes[0]==0)

          {

             candidate[0]=p[i];

             nTimes[0] = 1;

          }

        else if(nTimes[1]==0)

          {

             candidate[1]=p[i];

             nTimes[1] = 1;

          }

        else if(nTimes[2]==0)

         {

             candidate[2] = p[i];

             nTimes[2] = 1;

         }

         else {

                nTimes[0]--;

                nTimes[1]--;

                nTimes[2]--;

              }

     }

   for(int i = 0 ; i < 3;i++)

   printf("%d " ,candidate[i]);

} 

int main()

{

    FILE *fread = fopen("Id.txt","r");

    

    if(fread==NULL)

    {

       printf("can't open the file!\n");

       exit(0);

    }

    int current = 0;

    // 动态初始化数组 p ,如果不初始化会出现错误 

    int *p = (int*)malloc(sizeof(int)*10);   

    

    // id数组的长度 

    int length = 0 ; 

    // 将 数据读入内存,存入数组P 

    while(fscanf(fread,"%d",¤t)!=EOF)

    {

       if(length%10==0)

       p = (int*)realloc(p , sizeof(int)*(length+10));

       p[length] = current;

       length++;

    }

    

    findThreeK(p,length);

    /*

    for(int i = 0 ;i < length ;i++)

    printf("%d ",p[i]);

    */

    system("pause"); 

    return 0;

} 


你可能感兴趣的:(问题)