三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
设计思想:首先拿到这个问题,我们应该怎么找到突破口,按照软件工程的分解之道,复杂问题简单化,简单问题逻辑化。这里把这个问题抽象一下,就变成了一个找众数的问题。既然是找众数,那么按照我们以往最笨的方式把它实现就是统计每一个数出现的频率,然后比较频率,得出频率最多的那个数就是众数。那么我们要想简化算法,我们就反复读读前提条件,里面有个关键语句:该“水王”发帖数目超过了帖子数目的一半。那么以这个为突破口,我们可以设想,如果让水王的帖子和其他人的帖子一比一抵消,那么剩下来的还是水王的帖子,这样子我们就找到了水王。
代码实现:
最笨的办法:
package main; public class zs { public static void main(String[] args) { int[] a= {1,2,1,1,1,22,3,1,1,1}; candidate(a); } public static void candidate (int[] array) // 找出数组中出现次数最多的那个数 { int[] count = new int[101]; // 计数数组,每个元素的默认值为0 for(int i = 0; i < array.length; i++) { count[array[i]]++; // 对应的计数值加1 } int maxCount = count[0]; int maxNumber = 0; for(int i = 1; i < 100; i++) // 找出最多出现的次数 { if(count[i] > maxCount) maxCount = count[i]; } for(int i = 0; i < 100; i++) // 找出出现最多次的那个数字 { if(count[i] == maxCount) maxNumber = i; } System.out.println("出现次数最多的数字为:" + maxNumber); System.out.println("该数字一共出现" + maxCount + "次"); } }
简便方法:
package main; public class zs2 { public static void main(String[] args) { int[] a = { 1, 2, 3, 4, 1, 1, 1, 2, 2, 3, 4, 51, 1 }; int count = 1; int max = a[0]; for (int i = 1; i < a.length; i++) { if (max == a[i]) { count++; } else { count--; if (count == 0) { max = a[i + 1]; } } } System.out.println(max); } }
实现截图:
1.
2.
个人总结:
通过这次小练习,开阔了自己的思路,但是也深感自己在数据结构和算法方面的不足,革命尚未成功,同志任需努力