寻找小水王

寻找发帖“水王”问题的扩展:“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?

(一)分析问题:

如果每次删除四个不同的ID(不管是否包含发帖数目超过总数1/4的ID),那么,在剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4,可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案

(二)代码实现:

package 找小水王;

public class Xiaoshuiwang {

    static void Find(int ID[],int N,int candidate[])
    {
        int nTimes[]={0,0,0};
        for(int i=0;i<N;i++)
        {
            if(ID[i]==candidate[0])
            {nTimes[0]++;}
            else if(ID[i]==candidate[1])
            {nTimes[1]++;}
            else if(ID[i]==candidate[1])
            {nTimes[2]++;}
            else if(nTimes[0]==0)
            {
                nTimes[0]=1;
                candidate[0]=ID[i];
            }
            else if(nTimes[1]==0)
            {
                nTimes[1]=1;
                candidate[1]=ID[i];
            }
            else if(nTimes[2]==0)
            {
                nTimes[2]=1;
                candidate[2]=ID[i];
            }
            else
            {
                nTimes[0]--;
                nTimes[1]--;
                nTimes[2]--;
            }
        }
        System.out.println("三个符合条件的ID分别是");
        for(int i=0;i<3;i++)
        {
            System.out.println(candidate[i]+" ");
        }
    }
    public static void main(String args[])
    {
        int ID[]={1,1,1,2,2,2,3,3,3,1,2,3,1,2,3,6};
        int N=16;
        int candidate[] = {-1,-1,-1};

        System.out.println("打印ID列表");
        for(int i=0;i<N;i++)
        {
            System.out.println(ID[i]);
        }
        Find(ID,N,candidate);

    }
}

(三)实验截图:

时间: 2024-12-21 23:12:25

寻找小水王的相关文章

软件工程 寻找小水王

设计思想: 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4.已知小水王有三个,而且他们每个人发帖数均超过了1/4,按照id给所有帖子排序,这样同id的帖子就聚集在一起,由于每个水王的发帖数均大于1/4,所以可以根据每个id在数组中的位置找出三个水王. 代码: 实验结果:

寻找水王2——寻找三个小水王

一.实验题目 二.实现方法及设计思路 三.实验代码 //data:2016.5.27 #include<iostream> #include<string> #include<fstream> using namespace std; void getArray(string a[]) { string strTemp; //获取文件中第一个字符,判断文件是否为空 cout << "读取帖子列表可得:" << endl; fs

编程之美2.3: 寻找发帖水王

题目:传说,Tango有一大"水王",他不但喜欢发帖,还会回复其他ID发的帖子,发帖数目超过帖子总数的一半,如果你有一个当前论坛上所有帖子的列表,其中帖子作者的ID也在表中,你能快速找到这个传说中的Tango水王吗? 解题思路:由于水王的发帖数目超过一半,当每次删除两个不同ID的帖子时,水王占得帖子数目仍然大于剩下帖子的一半,重复整个过程,将ID列表中的ID总数降低,转化为更小的问题,从而得到最后水王的ID. #include <iostream> #include <

主元素 寻找发帖水王

寻找发帖“水王” 题目是这样描述的:“水王”发帖的数目超过了所有帖子的一半,有各个帖子的作者ID,求这个水王的ID 编程之美给出了两种巧妙的解法 解法一:ID排序,那么ID列表中的N/2项即为要找的ID(还要排序,时间复杂度为O(NlogN)) 解法二:通过查找,每次从列表中除去两个不一样的ID,最后就可以得出这个ID,时间复杂度O(N).写法上也有技巧,不必非要找到一个不一样的在继续下去,如果下一个一样,那么用一个变量记录这个次数,把次数+1,遇见不一样的-1.例如1,1,2,3,4 初始va

找小水王

一.题目要求 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思想 参考:http://www.cnblogs.com/sooner/archive/2013/04/02/2996589.html 由于大水王的代码,自己实现的不好,这次参考了别人的,但是还没弄透,明天再跟新,附自己理解后的代码!!!!! 三.代码实现 //mao2016.5.28 //找小水王 #include <iostr

寻找发帖水王02

题目:随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有3个发帖很多的ID.据统计他们的发帖数目都超过了帖子总数目的1/4,你能从发帖列表中快速找出他们吗? 设计思路: 水王01只需要一个结果,而现在需要3个结果,上题用到的nTimes,也应改为3个计数器.现在需要3个变量来记录当前遍历过的3个不同的ID,而nTimes的3个元素分别对应当前遍历过的3个ID出现的个数.如果遍历中有某个ID不同于这3个当前ID,就判断当前3个ID是否有某个的nTimes为0,如果有,那这个新遍历的ID就取

课堂测试-找小水王

题目:在上一次的基础上,大水王消失了,出现了三个小水王,并且他们发帖数均超过总数的1/4,要求:如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这三个小水王吗? 代码: //找小水王 lvguanghao #include <iostream> using namespace std; #define N 100 int main() { int xiaoshuiwang[3]; int ID[N], a; int num = 0; int count[

寻找发帖水王

理论: java实现: package 经典; public class 寻找发帖水王 { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 int[] a={1,6,4,6,5,6,6,7,6,6,6,3,6,6,13,6}; System.out.println(find(a)); } public static int find(int []a) { int result=0,ti

数字之魅——寻找发帖水王

寻找发帖水王这个题目给了我很大的启发,同时开阔了视野,往往在解决这类型问题的时候第一想法都是先排序再计算.而本题却给出了一个非常好的思路,时间复杂度为O(N). 它还有一个扩展问题,但是我在网上看了几篇有的写的考虑不周全,有的写的逻辑不是很清楚,这里我也根据思考和查阅,给出我自己的解法. typedef int Type; //给出Id的一个抽象 Type candidate[3] = {0}; //说明传的这个参数前要初始化. void find3(Type* ID,int N,Type* c