思路:
1,将数组按大小排序。
2,相邻两个元素比较是否相等,并记录相等次数得到这个元素出现的频率
3,在比较过程中,不断将最大次数和其对应的元素赋值给一个变量,最后得到出现频率最高的元素
4,通过集合收集并再次比较的方法处理多个元素出现频率同时最高的情况
我们以双色球蓝球的玩法为例,实现的代码如下:
int[] blueBalls = new int[n];
/*
* 随机出蓝球
*/
int blueBallNum = (int)(Math.random()*16 + 1); //随机一个蓝球号码
String blueBallString = "";
if (blueBallNum < 10) { //将蓝球int类型转化为String类型
blueBallString = "0" + blueBallNum;
}else{
blueBallString = String.valueOf(blueBallNum);
}
System.out.println("蓝球:" +blueBallString); //输出蓝球号码
blueBalls[i] = blueBallNum;
}//循环100次得到一个篮球号码的集合
//得到蓝球中出现最多的那个号及出现次数
for (int i = 0; i < blueBalls.length; i++) {//将收集到的蓝球元素进行大小排序
for (int j = i+1; j < blueBalls.length; j++) {
if (blueBalls[i] > blueBalls[j]) {
blueBalls[i] ^= blueBalls[j];
blueBalls[j] ^= blueBalls[i];
blueBalls[i] ^= blueBalls[j];
}
}
}
for (int i = 0; i < blueBalls.length; i++) {//展示数组中的内容
System.out.print(blueBalls[i] + " ");
}
System.out.println();
int count = 1;
int maxCount = 1;
int maxNum = blueBalls[0];
ArrayList<ReaptBall> list = new ArrayList<ReaptBall>();//建立一个集合来收集可能是最大频率的元素
for (int i = 0; i < blueBalls.length - 1; i++) {
if (blueBalls[i] == blueBalls[i + 1]) {//进行相邻两个数的比较,并记录出现次数
count ++;
}
if (blueBalls[i] != blueBalls[i + 1] || i + 1 == blueBalls.length-1) {//当跳过该数字或到最后时,将最大次数和其对应的号码记录下来
if (count > maxCount) {
maxCount = count;
maxNum = blueBalls[i];
}else if(count == maxCount){//将可能是最大的数字当作一个对象装到集合里
list.add(new ReaptBall(blueBalls[i], count));
}
count = 1;
}
}
for(ReaptBall reaptBall : list){//遍历集合,比较对象的count数和最大count数之间的关系,只有小于或等于最大数两种情况,
if (reaptBall.getCount() == maxCount) {//等于时输出相同count数的对象,
System.out.println("出现次数最多的蓝球是:" + reaptBall.getBallNum() + "出现的次数是:" + reaptBall.getCount());
}
}
System.out.println("出现次数最多的蓝球是:" + maxNum + "出现的次数是:" + maxCount);//小于时输出最大的count数
}
同时建一个辅助类将 球出现的频率和对应球的号码合成一个对象,放到集合里面
public class ReaptBall {
private int ballNum;
private int count;
public int getBallNum() {
return ballNum;
}
public void setBallNum(int ballNum) {
this.ballNum = ballNum;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public ReaptBall(int ballNum,int count){
this.ballNum = ballNum;
this.count = count;
}
}
通过以上方法可以完成在数组中出现频率最高的的那个元素(或那几个元素)。亲测有效,有更好的思路可以一起交流。
字符串可以先转化为char类型的数组,思路同上