华为机试题202205

举办一场8小时的聚会,时间段从12:00到20:00点,让来访的客人事先填好到达的时间和离开的时间,为了掌握聚会期间的座位数目,需要先估计不同时间的最大客人数量。
1.到达和离开的时间,以整点计算,输入为整数,比如“12,18”表示客人到达的时间为12点后13点前,离开的时间是17点后18点前。
2.按小时区间统计客人的数量,需要统计[12,13),[13,14)….[19,20)共有8个时间段的最大客人数量。
3.假设邀请的客人最多100个。
假设输入:

12,15
16,17
12,20
-1,-1

程序要求的输出结果为:

[12,13):2
[13,14):2
[14,15):2
[15,16):1
[16,17):2
[17,18):1
[18,19):1
[19,20):1

Java程序

第一种方法:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Hashtable;
import java.util.List;
public class Test {
    public static  List<String> list = new ArrayList<String>();
    public static void main(String[] args) {
        String[] str = {"12,15","16,17" ,"12,20"};
        for (int i = 0; i < str.length; i++) {
            reset(str[i]);
        }
        Hashtable<String, Integer>  wordCount = wordcount ();
        List<String> newlist = new ArrayList<String>();
        for (String key : wordcount ().keySet()) {
            newlist.add("[" + key + ")" + ":" + wordCount.get(key));
        }
        //重排
        Collections.sort(newlist, new Comparator() {  
            public int compare(Object o1, Object o2) {  
                String str1 = (String) o1;  
                String str2 = (String) o2;  
                if (str1.compareToIgnoreCase(str2)<0){    
                    return -1;    
                }    
                return 1;    
            }  
        });
        //输出结果
        for (int i = 0; i < newlist.size(); i++) {
            System.out.println(newlist.get(i));
        }
    }
    //字符串组合成制定格式,类似于16,17
    static void reset (String str) {
        String[] aa = str.split(",");
        int inter = Integer.parseInt(aa[1]) - Integer.parseInt(aa[0]);
        for (int i = 0; i < inter; i++) {
            int newString = Integer.parseInt(aa[0]) + i;
            list.add( newString + "," +(newString + 1) );
        }
    }  
    //统计次数
    static Hashtable<String, Integer> wordcount () {
        Hashtable<String, Integer>  wordCount = new Hashtable<String, Integer>();
        for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            if (!wordCount.containsKey(str)) {
                wordCount.put(str, Integer.valueOf(1));
            } else {
                wordCount.put(str, Integer.valueOf(wordCount.get(str).intValue() + 1));
            }
        }
        return wordCount;
    }
}

对于一个没学过数据结构与算法的人,暂且用这种方法处理。处理逻辑是:首先将指定字符,如”12,15”处理成要求的字符串,如12,13;13,14;14,15。其次,每个制定字符串处理完成之后,使用map集合统计每个字符串(如12,13)出现的总次数。最后,由于map的key是乱序的,所以使用Collections.sort进行重排一下,最终得到输出结果。
参考:https://blog.csdn.net/qy20115549/article/details/81711910

第二种方法:

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Demo {
    public static void main(String[] args) throws IOException {
        Map<String, Integer> result = new HashMap<>();
        Map<String,Integer> linkedMap = new LinkedHashMap<String,Integer>();
        Scanner in = new Scanner(System.in);
        String temp;
        while(in.hasNext()){
            temp = in.nextLine();
            String[] split = temp.split(",");

            int a = Integer.valueOf(split[0]);
            int b = Integer.valueOf(split[1]);
            if (a > b || a < 12 || b > 20) {
                break;
            }

            for (int i = a; i < b; i++) {
                String key = "[" + i + "," + (i + 1) + ")" + ":";
                if (result.containsKey(key))
                    result.put(key, result.get(key) + 1);
                else
                    result.put(key, 1);
            }
        }
        linkedMap = result.entrySet().stream().sorted(
                Map.Entry.<String, Integer>comparingByKey()).collect(
                Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (o1, o2) -> o1, LinkedHashMap::new));

        linkedMap.entrySet().forEach(e -> System.out.println(e.getKey() + e.getValue()));

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值