课堂作业——找水军

题目:

思路:

  编程之美的扩展了这个问题,在求解找出一个“水王”的基础上进行补充分析,之前遍历数组的时候只用保存两个值:一个是数组中的ID,一个是它对应出现的次数。而这次需要找出3个ID(即输出3个结果),就需要另开辟新的数组来分别保存。首先保存前3个ID,每当遍历下一个ID的时候,先要判断下一个和当前保存的这3个ID是否有相同的,若有相同的则此ID对应的次数加1;若不同则次数减1。再判断如果有ID次数为零,就用下一个ID把它替换,并把次数设为1。与之前不同的是,可能会出现次数都不为0的情况,这时就将所有的次数都减1。

源代码:

 1 #include<iostream.h>
 2 #define N 16
 3 class Type
 4 {
 5     public:
 6     Type()
 7     {
 8         count=0;
 9         id=-1;
10     }
11     int count;
12     int id;
13 };
14 int main()
15 {
16         int ID[N]={7,10,7,4,5,5,10,7,7,7,10,10,5,5,10,4};
17         Type candidate1;
18         Type candidate2;
19         Type candidate3;
20     int i;
21     for(i=0;i<N;i++)
22     {
23         if(ID[i]==candidate1.id)
24                 {
25             candidate1.count++;
26                 }
27         else if(ID[i]==candidate2.id)
28                 {
29             candidate2.count++;
30                 }
31         else if(ID[i]==candidate3.id)
32                 {
33             candidate3.count++;
34                 }
35         else if(candidate1.count==0)
36         {
37             candidate1.id=ID[i];
38             candidate1.count++;
39         }
40         else if(candidate2.count==0)
41         {
42             candidate2.id=ID[i];
43             candidate2.count++;
44         }
45         else if(candidate3.count==0)
46         {
47             candidate3.id=ID[i];
48             candidate3.count++;
49         }
50         else
51         {
52             candidate1.count--;
53             candidate2.count--;
54             candidate3.count--;
55         }
56     }
57     cout<<candidate1.id<<endl;
58     cout<<candidate2.id<<endl;
59     cout<<candidate3.id<<endl;
60     return 0;
61 }
62                 

运行结果:

总结:

  因为还要考虑时间复杂度,所以就按照上次的代码进行修改,每次把当前保存的三个ID分别展开(if...else),与下一个ID进行比较,在对其对应的次数操作加、减。

  在论坛上看见有用类和结构体来定义新数组的,这样就不会每次比较时还要遍历新的数组,缩短了时间复杂度。很久没涉及了,现在看到又回忆起来了一些,温故而知新,也知道了什么时候可以用什么结构和方法。

时间: 2024-08-24 06:10:55

课堂作业——找水军的相关文章

课堂作业——找1

题目: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5: 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少? 设计思想: (解法一) 开始想到了一个最简单的方法来计算f(N),那就是从1开始遍历,直到N结束,把其中每一个数中含有“1”的个数加起来,结果就是从1到N所有“1”的个数的和.这个方法很简单,但算法的实现效率是个大问题,如果N很大,则

课堂作业找水王2

找水王2: 超级水王没有了.统计结果表明,有3个发帖很多的ID ,他们的发帖数目都超过了帖子总数目N的1/4.你能从发帖ID列表中快速找出他们ID吗? 设计思想: 和上一次的思路同源,如果每次删除四个不同的ID(不管是否包含发帖数目超过总数1/4的ID),那么,在剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4,可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案. 代码实现: package test1; public class F

课堂作业-找水王2

1.题目要求: 随着论坛的发展,管理员发现水王没有了,但是统计结果表明, 有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 2.设计思路: 因为三个小水王的ID在所有发帖ID中均超过1/4,所以初始化水王的时候可以用4个ID相比.如果所有ID序列排列在1-4的四个ID中出现相同ID名,那么就可以利用一个包含三个元素的数组初始化小水王ID:如果所有ID序列排列在1-4中无重复ID名,则在排列在4-8中寻找是否存在重复的ID名.以此循环直到找到在4个ID中出现

课堂作业--寻找水军

一.题目要求 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思路 本次题目是在上次寻找“水王”的基础上进行拓展,设计思路和上次的相似,上次寻找水王是用的一个水王变量,一个计数变量,那么本次的设计思想沿用上次的技巧,有三个水军变量,三个计数变量:分别使水军的这三个变量和下一个数比较,然后和三个水军相对应的计数变量分别进行计数,相同则加一,不同则抵消减一:依次循环,和水王的规则类似,最后找到3

课堂作业——找“小水王”

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

课堂作业——找水王

题目: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半.如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 设计思路: (1)输入发帖ID记录表 (2)从第一个ID开始,与后续的发帖ID进行比较,若相同计数器则加一,否则减一.若计数器的数值被减为零,则重新选取当前ID开始记录比较. (3)输出结果 源代码

软件工程概论课堂作业3

题目:返回一个整数数组中最大子数组的和 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 设计思想: 用户自定义数组长度并依次输入数组元素,设一个全局变量初始化为零的数组a[N],N=10000: 1.因为该数组首尾相接可视作一个环,那么我们需要在一个合适的位置断开,把数组元素展成一条笔直的带子. (1).设用户自定义数组长度为m,输入数组各元素值a[1

软件工程课堂作业04

软件工程课堂作业04 源代码: 1 package jian; 2 import java.io.*; 3 import java.util.Scanner; 4 public class Point3D{ 5 public static int Lenght(int list[],int lenght) 6 { 7 int i,max; 8 max=list[0]; 9 for(i=1;i<=(lenght-1);i++) 10 { 11 if(list[i]>max) 12 { 13 ma

课堂作业及 动手动脑问题整理

课堂作业一 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”. 程序: package com; public class Duixiang { public static void main(String[] args){ duixiang a=new duixiang(); a.out(); duixiang b=new duixiang(); b.out(); } } class duixiang{ stati