• 课堂练习-找水王(续)


    一、题目

      随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗

    二、设计思路

     参考原来问题的解法http://www.cnblogs.com/a1397240667/p/5509088.html

    如果每次删除4个不同的ID(不管是否超过总数1/4的ID),那么,剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4。上题只需要一个结果,而现在需要3个结果,上题用到的counter,也应改为3个计数器。现在我们需要3个变量来记录当前遍历过的3个不同的ID,而counter的3个元素分别对应当前遍历过的3个ID出现的个数。具体方法:用candidate[3]记录三个候选ID,用count[3]记录它们的累积次数,然后遍历整个ID列表,每处理一个ID,若与candidate[i]中的某一个相同,则count[i]++,若与三个都不同,则说明找到了四个互不相同的ID,将三个count[i]--,也就相当于“删除了四个不同ID”,若某一个count[i]==0,则更新之。

    三、源代码

     1 /*2016.5.23 weilihua 找水王(续)*/
     2 #include<iostream>
     3 using namespace std;
     4 #define NUM 100
     5 int main()
     6 {
     7       int length=0;
     8       while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入
     9       {
    10         cout<<"请输入ID数量:";
    11         cin>>length;
    12        }
    13        int arr[NUM];
    14        cout<<"输入作者id(不为0):"<<endl;
    15        for(int i=0;i<=(length-1);i++)
    16        {
    17            cin>>arr[i];
    18            if(arr[i]==0)
    19            {
    20                cout<<"id不为0,请重新输入:";
    21            cin>>arr[i];
    22            }
    23 
    24        }
    25 
    26     int sw [3]={0}; 
    27     int count[3] = {0};  //标记变为3个
    28      bool flag = false;
    29     for(int i=0;i<length;i++)
    30     { 
    31             if(arr[i]==sw[0])  
    32             {  
    33                  count[0]++;  
    34             }  
    35             else if(arr[i]==sw[1])  
    36             {  
    37                  count[1]++;  
    38             }  
    39             else if(arr[i]==sw[2])  
    40             {  
    41                  count[2]++;  
    42             }  
    43             else if(count[0]==0)  
    44             {  
    45                  count[0]=1;  
    46                  sw[0]=arr[i];  
    47             }  
    48             else if(count[1]==0)  
    49             {  
    50                  count[1]=1;  
    51                  sw[1]=arr[i];  
    52             }  
    53             else if(count[2]==0)  
    54             {  
    55                  count[2]=1;  
    56                  sw[2]=arr[i];  
    57             }  
    58             else  
    59             {  
    60                  count[0]--;  
    61                  count[1]--;  
    62                  count[2]--;  
    63              }  
    64 
    65     }
    66     
    67         cout<<"水王id:"<<endl;
    68         for(int i=0;i<3;i++)
    69         {
    70             cout<<sw[i]<<" ";
    71         }
    72     
    73         cout<<endl;
    74         return 0;
    75 }

    四、截图

    五、项目计划日志

    周活动总结表

    姓名:魏**                  日期2016.5.26

    日期   任务 听课  编写程序 阅读书籍 准备考试     日总计

    周一

    100   30       130

    周三

        30       30

    周四

      100         100

    周总结

    100 100 60       260

    阶段时间和效率                                            周数(上一次周活动表的周数+1):

    不包括上一周在内的累计时间      

    总计

     100

     100

     60

     

     

     

     260

    平均

     100

     100

     60

     

     

     

     260

    最大

     100

     100

     60

     

     

     

     260

    最小

     100

     100

     60

     

     

     

     260

     以前各周的累计时间      

    总计

     100

     100

      60

     

     

     

     260

    平均

     100

    100

      60

     

     

     

     260

    最大

     100

    100

     60

     

     

     

     260

    最小

     100

    100

     60

     

     

     

     260

    六、时间记录表:

    学生       魏**                                           日期   2016年5月26日 

    教师        王**                                          课程        软件工程      

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

     5.23

     14:30

    16;20 

    10

     100

     上课

     

     5.24

     21:30

     22:00

     无

    30

    人月神话

     

     5.25

    22:00

    22:30

     无

    30

    人月神话

     

     5.26

    14:30

    16:30

    100

    编写程序

    作业

    七、个人总结

      这次找水王程序的思路,和原来找水王的是一样的,都是采用互消的方法,只不过由两两互消变为了四个四个的消。我们以后解决程序问题时要注意迭代以往做过的程序,把问题的难度降低,再完成简单任务的基础上完成更难的任务。

  • 相关阅读:
    G面经prepare: Maximum Subsequence in Another String's Order
    G面经prepare: Set Intersection && Set Difference
    G面经prepare: Pattern Match
    G面经prepare: Data Stream Average
    Summary: Final Keyword
    G面经prepare: Android Phone Unlock Pattern
    G面经prepare: Jump Game Return to Original Place
    G面经prepare: Reorder String to make duplicates not consecutive
    G面经prepare: Sort String Based On Another
    G面经Prepare: Valid Preorder traversal serialized String
  • 原文地址:https://www.cnblogs.com/a1397240667/p/5532820.html
Copyright © 2020-2023  润新知