zoukankan      html  css  js  c++  java
  • 软件工程课堂作业——寻找“水王”

    一、题目:

    三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

    二、设计思路:

        我们由题目可以知道这个水王的发表帖子的次数超过了所有帖子的一半, 所以采用两两相比的方式,若count=0,说明前面的数值相抵消,最后count>0,所以最后一次改变的ID就是水王的ID.

        1、定义一个count用来计数;

        2、先假设这个水王的ID是数组的第一个值,然后依次和后面的一个数比较,若两数相等,count++;

        3、若两数不相等,count——,若count<=0;说明与水王ID相等的比与水王ID不相等的次数要少或者是一样,所以这个水王的ID就是不真正水王的ID ,将其后的一个值看作是水王的ID,将count清零,代表前面的数相抵消,继续比较。

     1 #include<iostream>
     2 using namespace std;
     3 void getwaterKing_ID(int Num_id,int Array_id[])       //用来获取水王的ID
     4 {
     5     int waterking_id=Array_id[1];                     //假设水王的ID为贴吧第一个发帖人的ID
     6     int count=0;
     7     for(int i=0;i<Num_id;i++)                         //利用ID不相等后两两相消,得出最后的count的值,由于水王的帖子是大于发帖子数组的一半的,最后count的值大于零
     8     {
     9         if(waterking_id==Array_id[i])                 
    10         {
    11             count++;
    12         }
    13         if(waterking_id!=Array_id[i])
    14         {
    15             count--;
    16         }
    17         if(count<=0)
    18         {
    19             waterking_id=Array_id[i];
    20             count=0;
    21         }
    22         
    23     }
    24     
    25     cout<<waterking_id<<endl;
    26 }
    27 int main()
    28 {    
    29     int array_id[100];
    30     int num_id;
    31     cout<<"假设用数字来表示发表帖子的每个用户的ID"<<endl;
    32     cout<<"贴吧中发表的帖子数目为:"<<endl;
    33     cin>>num_id;
    34     cout<<"假设发表帖子的ID :"<<endl;
    35     for(int i=0;i<num_id;i++)
    36     {
    37         cin>>array_id[i];
    38     }
    39     cout<<"这个贴吧中的水王的ID号为:"<<endl;
    40     getwaterKing_ID(num_id,array_id);
    41     return 0;
    42 }

    四、测试用例
    1、帖子数目是偶数:

    2、帖子数目是奇数的:

    五、实验总结:虽然这次实验是寻找水王的,但是抽象出来就是找一个数组中某个元素出现次数大于数组元素个数一半的那个数,按照我们以前的做法,我们都会是先遍历一遍,然后排序,找出这个数值,但是这样做算法不仅麻烦,而且时间复杂度很高,所以老师告诉了我们一种比较简单的算法,就是抵消,最后剩下的书就是所要找的元素。通过这个试题,我不仅学会了一种简单的算法,二是学会了一种思想,首先要学会转化,把复杂的问题抽象为简单的问题,然后就是寻找简单的算法,这样才能高效率的解决问题。

  • 相关阅读:
    centos7下配置时间同步服务器
    交换机简单配置(转)
    ubuntu16.04安装docker CE
    docker下使用DB2
    iptables之centos6版本详解
    iptables之centos6版本常用设置
    iptables介绍iptables和netfilter
    git的使用学习(九)搭建git服务器
    js 图片预览
    ps -ef | grep java 查看所有关于java的进程
  • 原文地址:https://www.cnblogs.com/luxin123/p/5510109.html
Copyright © 2011-2022 走看看