ACM(百度之星题目)-1004-JAVA

题目:
在这里插入图片描述代码:


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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值