课堂练习_水桶

一、问题描述

    随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。

  据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?

二、解决思想

    根据上一次水王的方法,我这次试用的还是“消消乐”的方法,不过与上次不同的是,在这次的代码中,计数器变成了三个,

  同时,由一个“水王”,变成了三个“水桶”,思想和上次的一样。

三、源代码

  

//田永涛
//2015.4.25
#include "stdafx.h"
#include <stdio.h>
#define Length 21                //设置最大长度为100
int MIN(int num[])                //求出count[]中最小的数,以便减1
{
    int min;
    min = num[1];
    for(int i=1;i<3;i++)
    {
        if(min>num[i])
            min = num[i];
    }
    return min;
}
void judge(int Arr[Length])
{
    int i,j = 0;
    int flag1,flag2,flag3;                        //用来表示水桶
    int count[3] = {0,0,0};                        //用来计录当前水王数目
    flag1 = -1;                                    //初始化水桶
    flag2 = -1;
    flag3 = -1;
    while((flag1==-1)||(flag2==-1)||(flag3==-1))    //while循环做的是将ID表中不相等的最前的三个找出并作为水桶
    {
        if((flag1 == Arr[j])||(flag1 == -1))
        {
            flag1 = Arr[j];
            count[0]++;
        }
        else if((flag2 == Arr[j])||(flag2 == -1)) //将水桶与ID表中的数赋值
        {
            flag2 = Arr[j];
            count[1]++;
        }
        else if((flag3 == Arr[j])||(flag3 == -1))
        {
            flag3 = Arr[j];
            count[2]++;
        }
        j++;                                    //用来计数,记录当前ID表中已经遍历的ID数目
    }
    for(i=j;i<Length;i++)                        //运用“消消乐”的方法,将ID表中的水桶找出
    {
        if(flag1 == Arr[i])                        //当当前ID与已知的水桶相等时
        {
            flag1 = Arr[i];
            count[0]++;
        }
        else if(flag2 == Arr[i])
        {
            flag2 = Arr[i];
            count[1]++;
        }
        else if(flag3 == Arr[i])
        {
            flag3 = Arr[i];
            count[2]++;
        }
        else                            //d当当前的ID与已知水桶的三个ID都不相等时
        {
            if(count[0] == MIN(count))        //找出最小的count,减1
            {
                count[0]--;
                if(count[0]<1)
                {
                    flag1 = Arr[i+1];
                    count[0] = 1;
                    i++;
                }
            }
            else if(count[1] == MIN(count))
            {
                count[1]--;
                if(count[1]<1)
                {
                    flag2 = Arr[i+1];
                    count[1] = 1;
                    i++;
                }
            }
            else if(count[2] == MIN(count))
            {
                count[2]--;
                if(count[2]<1)
                {
                    flag3 = Arr[i+1];
                    count[2] = 1;
                    i++;
                }
            }
        }
    }
    printf("水桶的ID是:%d %d %d\n",flag1,flag2,flag3);                //输出结果
}
int main(int argc, char* argv[])
{
    int Array[Length] = {1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4};
    printf("ID表中的内容是:\n");
    for(int i=0;i<Length;i++)
    {
        printf("%d ",Array[i]);
    }
    printf("\n\n");
    judge(Array);
    return 0;
}

四、运行截图

  

五、总结

    这次的课堂作业和上次的几乎一样,最起码在代码实现的思想上是一样的,但是,我觉得在一些小细节方面还是有所不同的。

  比如:在对水桶flag1,flag2,flag3赋值时,如果采用flag1 = Arr[0],flag2 = Arr[1],...时,显然是不合适的,因为前几个ID

  有可能一样,因此,在代码实现的过程中,我运用了while语句(具体实现方法请看代码),对ID表中最前面不一样的三个赋值,且

  对计数器count[i]进行++,

  这样就能解决问题了。

posted @ 2015-04-25 16:43  我是一个小小小字符串  阅读(149)  评论(0编辑  收藏  举报