题目:
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
设计思想:
最简单的思路就是:统计每一个ID出现的次数,然后找出出现最多的ID就是水王。
第二种更优的思路就是:利用水王发帖次数大于一半,然后两两一消,从第一个数开始,如果等于它的下一位,number+1,
如果不等于,number-1,不等于相当于把这两个帖子都删除,直接从这两个的后一个开始。
最后由于水王发帖数大于一半,不管怎样,它肯定会被剩下,从而得出水王ID。
代码实现:
法一:
public class ShuiW { /* 法一:统计每一个ID出现的次数 public static int tj(int[][] array,int number) { int sum = 0; for(int i = 0; i < array.length;i++) { if(array[i][1] == number) { sum = sum + 1; } } return sum; } public static void main(String args[]) { int [][] a = {{1,1},{2,2},{3,5},{4,1},{5,5},{6,5},{7,5},{8,5},{9,5},{10,7}}; int[][] ID = new int[a.length][2]; for(int i = 0;i < a.length;i++) { ID[i][0] = tj(a,a[i][1]);次数 ID[i][1] = a[i][1];数 } int max = ID[0][0]; int p = 0; for(int j = 1 ; j < ID.length; j ++) { if(ID[j][0] > max) { max = ID[j][0]; p = ID[j][1]; } } System.out.println("最多"+max+"次,数为"+p); } }
法二:
public static int find(int[] array) { int size = array.length; int result = 0; int number = 0; for (int i = 0; i < size; i++) { if (number == 0) { result = array[i]; number = 1; } else { if (result == array[i]) { ++number; } else { --number; } } } return result; } public static void main(String[] args) { int[] array = { 2, 3, 2, 3, 7, 3, 9,3, 6,3, 1,3, 4,3, 10,3,3 }; System.out.println("水王的ID:"+find(array)); }
实现截图:
法1:
法2.:
个人总结:
通过本次课堂练习,我得出一个重要的结论就是,一定要读懂题,将其分析透彻,自己一开始就是不懂利用水王发帖数目超过了帖子数目的一半这个条件以至于没有好的思路,后来经同学和老师提醒,才有了眉目。