• 课堂练习_水桶


    一、问题描述

        随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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
    ",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表中的内容是:
    ");
        for(int i=0;i<Length;i++)
        {
            printf("%d ",Array[i]);
        }
        printf("
    
    ");
        judge(Array);
        return 0;
    }

    四、运行截图

      

    五、总结

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

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

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

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

      这样就能解决问题了。

  • 相关阅读:
    C++中使用stringstream进行类型转换操作
    代理模式
    观察者模式 VS 责任链模式
    10.模板方法模式
    2.里氏替换原则
    单一职责原则
    规格模式
    策略模式的扩展——策略枚举
    策略模式 VS 桥梁模式
    原型模式【下】
  • 原文地址:https://www.cnblogs.com/littlechar/p/4456150.html
Copyright © 2020-2023  润新知