题目:
代码:
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
/**
* 找出数组中出现次数最多的那个数--主元素问题
*/
public class Main1004 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()) {
int n=sc.nextInt(); //控制一行输入多少个数
if(n<=0)
break;
String a[]=new String[n];
for(int j=0; j<a.length; j++) {
// a[j]=sc.next();
String x=sc.next();
if(x.getBytes().length<=15) {
a[j]=x;
}else if(x.getBytes().length>15){
j=j-1;
continue;
}
}
searchMuch(a);
}
}
/**
* 该算法是使用了 HashMap 的链表数组的结构<p/>
* 思路:<p/>
* 1.把数组中的每一个值,看做是HashMap中的 Key,第一次出现则把对应的Key的value设置为1(即出现一次)<p/>
* 2.后续则判断以数组值为key,是否在HashMap中存在,若存在则对应的value加1,<p/>
* 3.重复步骤1和2,然后找到HashMap中value最大的键值对(此时:该value对应数组中数字出现大的重复次数,key则对应着值)<p/>
* HashMap中的Key就是数组中的值,value即为该数值出现的次数<p/>
*
* 时间复杂度为O(N),空间复杂度为O(N)
* @param arr
*/
public static void searchMuch(String[] arr) {
HashMap<String, Integer> hashMap = new HashMap<>();
int length = arr.length;
for (int i = 0; i < length; i++) {
//已数组中的值,作为HashMap中的Key
String value = arr[i];
//判断相关的key是否已存在
if (hashMap.containsKey(value)) {
//存在,则说明之前有出现过,则重复次数再次加1(对应的value加1)
int count = hashMap.get(value);
hashMap.put(value, count + 1);
} else {
//不存在,说明是第一次出现,则直接设置对应的value为1(value即表示该数值出现的次数)
hashMap.put(value, 1);
}
}
//已value创建集合
Collection<Integer> collection = hashMap.values();
//找到最大的值(即最大重复次数)
int maxCount = Collections.max(collection);
String maxNumber = "";
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
//循环遍历,在HashMap中找到vmaxCount(最大重复次数)所对应的key(最大重复次数所对应的数值)
if (entry.getValue() == maxCount) {
maxNumber = entry.getKey();
}
}
System.out.println(maxNumber);
// System.out.println("出现次数最多的数字是:" + maxNumber);
// System.out.println("该数字一共出现了:" + maxCount + " 次");
}
}
网上找到的另一个代码:出处未记录,如有侵权,请联系删除~
import java.util.*;
import java.io.*;
public class Main4{
public static void main(String[] args) throws Exception{
Scanner cin = new Scanner(System.in);
//控制测试用例
while(cin.hasNextInt())
{
int num = cin.nextInt();
//输入0结束测试
if(num<=0)
break;
//输入测试数据
List<Item> items = new ArrayList<Item>();
for(int i = 0;i<num;i++){
String item = cin.next();
boolean flag = false;
for(int j = 0;j<items.size();j++){
//当前集合中包含输入的气球
if(items.get(j).str.equals(item)){
items.get(j).count+=1;
flag = true;
break;
}
}
//当前集合中不包含输入的气球
if(!flag){
items.add(new Item(item,1));
}
}
//找出最多气球的气球个数
int max = items.get(0).count;
for(int i = 1;i<items.size();i++){
if(items.get(i).count>max){
max = items.get(i).count;
}
}
//输出所有的最多的气球
for(int i = 0;i<items.size();i++){
if(items.get(i).count == max){
System.out.println(items.get(i).str);
}
}
}
}
}
class Item{
public String str;
public int count;
public Item(String s,int c){
str = s;
count= c;
}
}