软件工程作业--找水王续

题目要求:

•三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。

•如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码)

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

实现思路:

1.还是将问题抽象化,目前有一组数据,其中有大于等于4分之1的数据是一个确定的值,而且这样的确定的值有三个,剩下的不到四分之一的值都不重复。

2.这样就好办了,还是按照第一次找水王的思路来就可以啦,不过这次的返回值是三个,需要用到数组来解决,nTimes 的3个元素分别对应当前遍历过的3个ID出现的 个数。如果遍历中有某个ID不同于这3个当前ID,我们就判断当前3个ID是否有某个的nTimes为0,如果有,那这个新遍历的ID就取而代之,并赋1 为它的遍历数(即nTimes减1),如果当前3个ID的nTimes皆不为0,则3个ID的nTimes皆减去1,这也就是解决本文题的关键了。由于非 水王ID不满总帖数的1/4,与上题思路相同,所遍历ID与当前3个ID不同时,就一同抵消(即3个当前ID的nTimes值减1),最终留下来的3个当 前ID总会是3个超过1/4的水王ID。

代码实现:

  1 public class Find {
  2     static int[] ID=new int[100];
  3     int Rand()//生成0-1内的随机数
  4     {
  5         java.util.Random random=new java.util.Random();// 定义随机类
  6         int result=random.nextInt(4);// 返回[0,4)集合中的整数,注意不包括4
  7         return result;
  8     }
  9     void FirstC()//初始化数组;
 10     {
 11         for(int i=0;i<100;i++)
 12         {
 13             if(Rand()==0)
 14             {
 15                 ID[i]=50;//水王一号的ID
 16             }
 17             else if(Rand()==1)
 18             {
 19                 ID[i]=60;//水王二号的ID
 20             }
 21             else if(Rand()==2)
 22             {
 23                 ID[i]=70;//水王三号的ID
 24             }
 25             else
 26             {
 27                 ID[i]=i;
 28             }
 29
 30         }
 31
 32     }
 33     void Out()
 34     {
 35         System.out.println("以下是水贴的ID单");
 36         for(int i=1;i<=ID.length;i++)
 37         {
 38             System.out.print(ID[i-1]+" ");
 39             if(i%10==0)
 40             {
 41                 System.out.print("\n");
 42             }
 43         }
 44     }
 45 /*    int Serch()//思想实现部分
 46     {
 47         int candIDate=50;
 48         int ntimes,i;
 49         for(i = ntimes = 0;i<ID.length;i++){
 50           if(ntimes == 0){
 51             candIDate = ID[i];
 52             ntimes = 1;
 53           }
 54           else{
 55             if(candIDate == ID[i])
 56               ntimes ++;
 57             else
 58               ntimes --;
 59           }
 60         }
 61         return candIDate;
 62     }*/
 63     public static int[]  Serchs(int[] ID)
 64     {
 65
 66                 if(ID == null) return null;
 67                 int candate0= 0;
 68                 int candate1= 0;
 69                 int candate2= 0;
 70                 int times0 = 0;
 71                 int times1 = 0;
 72                 int times2 = 0;
 73                 int len = ID.length;
 74                 for(int i =0;i<len;i++){
 75                     if(times0==0&&ID[i]!=candate1&&ID[i]!=candate2){
 76                         candate0=ID[i];
 77                         times0++;
 78                     }
 79                     else if(times1==0&&ID[i]!=candate0&&ID[i]!=candate2){
 80                         candate1=ID[i];
 81                         times1++;
 82                     }
 83                     else if(times2==0&&ID[i]!=candate0&&ID[i]!=candate1){
 84                         candate2=ID[i];
 85                         times2++;
 86                     }
 87                     else if(ID[i]!=candate1&&ID[i]!=candate0&&ID[i]!=candate2){
 88                         times0--;
 89                         times1--;
 90                         times2--;
 91                     }
 92                     else if(ID[i]==candate0)
 93                         times0++;
 94                     else if(ID[i]==candate1)
 95                         times1++;
 96                     else if(ID[i]==candate2)
 97                         times2++;
 98                 }
 99                int[] result = {candate0,candate1,candate2};
100                 return result;
101             }
102
103     @SuppressWarnings("static-access")
104     public static void main(String[] args) {
105         Find a = new Find();
106         a.FirstC();
107         a.Out();
108         int[] results=new int[3];
109         results=a.Serchs(ID);
110         System.out.println("三个水王的ID分别是");
111         for(int i=0;i<3;i++)
112         {
113             System.out.println("第"+(i+1)+"个水王的ID是"+results[i]);
114         }
115
116     }
117
118 }

运行结果截图:

修改水王ID再次运行程序,观察结果:

运行结果:

心得体会:

1.思想非常重要,

2.当遇到再三思索后实在不懂的问题是第一反应应当是"百度一下"当然,先把问题看会在交作业,学到的就是自己的,学习能力也很重要嘛!

时间: 2024-10-14 00:31:41

软件工程作业--找水王续的相关文章

软件工程作业-找水王

题目: •三人行设计了一个灌水论坛. 信息学院的学生都喜欢在上面交流灌水, 传说在论坛上有一个“水王”,他不但喜欢发帖, 还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. •如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 1.设计思想: 每次删除两个不同的id,在剩下的id里,原最高频id出现的频率一样超过了50%,不断重复这个过程,最后剩下的将全是同样的id,即水王. 2.代码如下: #include<

软件工程作业-找水王2

1.设计思想: 如果每次删除四个不同的ID,那么,在剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4,可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案. 2.代码如下: #include<iostream> using namespace std; void FindID(int ID[],int n,int rightID[]); int main() { int ID[16]={1,1,1,2,2,2,3,3,3,1,2,3,

4月24号周五课堂练习:找水王续

一.题目要求 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半.如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思路 三.程序代码 #include<

个人项目——找水王续

寻找论坛里的水王(续) 一.程序要求 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数目都超过了帖子总数目N的1/4.你能从发帖ID列表中快速找出他们的ID

课堂练习--“找水王续&quot;

设计思路: ①跟上次思路一样,将问题简化成从一个数组中找出出现次数最多的3个数. ②将“两两相消"的思路模式,变成“三一相消” ③初始化time为零,kingid为零,然后按顺序赋值,遇到跟kingid1相同的time1+1,其余两个同样:遇到跟三个都不同的所有time-1. 代码: import java.util.*; public class Findthreenum { public static void main(String[] args) { Scanner input = ne

找水王续

1题目要求: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码) 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 2设计思路: 同上一个思路相

课堂练习-找水王续

1.题目. 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半.如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码)随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 2.设计思想. 通过消除的方法实现

课堂练习——找水王续

题目:随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 一.设计思路 如果按照先排序后查找的话,三个小水王则分别在1/4处,1/2处,3/4处,时间复杂度则为O(nlogn),不满足时间复杂度要求.参考上次找水王题目,每次消除两个不一样ID的帖子,则最后剩下的即是水王.此题可参照此方法,但一次要消除四个不同ID的帖子,消到最后,依旧是他们三个占据总数分别超过1/4.如此做法,虽然满足时间复杂度,但是空

课堂练习之找水王

1.设计思想: 主题思路就是删除ID,每当遇到不同的ID,则删除上一个作为对比对象的ID,依次遍历所有的ID,最后剩下的那个一定是水王. 2.代码设计: //找水王,王昭博. #include <iostream> using namespace std; void main() { int num,ID[100]; cout<<"请输入帖子的数量:"; cin>>num; int i; cout<<"请依次输入帖子对应的ID号