题目:
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖 数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
一、设计思想
如果ID表是有序的,由于水王ID超过总贴数一半,则在有序表中的N/2项一定是水王的ID,此时算法的复杂度为O(n*n)
若想要时间复杂度为O(n),可以遍历ID表,两两相邻的ID进行比较,若不同则删掉,那么在剩余的ID表中水王的ID号仍然超过总数的一半,不断重复这个过程,把列表中ID总数降低,最后剩下的肯定是水王的ID。
二、源代码
1 package com.java.lianxi; 2 3 public class lianxi7 { 4 public static void main(String arg[]) 5 { 6 int[] ids = {1,2,3,1,1,1,2,2,2,4,1,1,1,3,3,1,1,1}; 7 System.out.println("水王的ID是"+findshuiwang(ids)); 8 } 9 public static int findshuiwang(int[] id) 10 { 11 int n = id.length; 12 int shuiwang = 0; 13 int count=0; 14 for(int i=0;i<n;i++) 15 { 16 if(count == 0) 17 { 18 shuiwang = id[i]; 19 count = 1; 20 } 21 else 22 { 23 if(shuiwang == id[i]) 24 count ++; 25 else 26 count --; 27 } 28 } 29 return shuiwang; 30 } 31 }
三、截图
四、心得体会
拿到这道题,我刚开始想到的就是编历所有id,并对每个ID进行计数,但是不太容易实现,要用到结构体,后来老师提到了遍历然后排序,中间项肯定是水王ID,可是时间复杂度为n*n,为了降低时间复杂度,老师提示用消消乐的思想,后来我们就想到了如何解决。一道题目有好多种解法,我们应当拓宽思路,以后还要多练习写程序,孰能生巧。