蚂蚁金服一面笔试题

题目

  1. 设计一个server,实现两个接口,功能如下:
  2. 允许用户上传一个列表,包含一组单词,单次不超过1万(总规模一亿)
  3. 允许用户查询当前上传单词中出现频率最高的前100个单词及出现的次数

分析

  1. 需要一个容器用来存储数据
  2. 该容器具有排序的功能

方案

  • 选用treeMap存储数据,key是字符串单词,value是单词出现的次数

代码

存储数据接口
private static final Logger logger = LoggerFactory.getLogger(MayiTestController.class);
    private volatile TreeMap<String,Integer> map = new TreeMap<>();

    /**
     * 存储用户上传的数据
     * @param list
     */
    @RequestMapping(value = "insert",method = {RequestMethod.GET,RequestMethod.POST})
    public void insertBatch(@RequestBody ArrayList<String> list){

        logger.info("insert start list = {}", JSON.toJSONString(list));
        list.forEach(r ->{
            if (map.containsKey(r)){
                Integer count = map.get(r);
                map.put(r,count+1);
            }else {
                map.put(r,1);
            }
        });
    }
查询接口
/**
     * 查询出现频率最高的前一百个单词及出现个数
     * @return
     */
    @RequestMapping(value = "selectLimit100")
    public Map<String,Integer> selectLimit100(){
        List<Map.Entry<String,Integer>> list = new ArrayList(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });

        logger.info("排序后的list list = {}",JSON.toJSONString(list));

        Map<String,Integer> map = new LinkedHashMap<>();

        for (int i = 0; i < 100; i++) {
            map.put(list.get(i).getKey(),list.get(i).getValue());
        }

        return map;
    }
请求保存接口蚂蚁金服一面笔试题_第1张图片

字符串是随意复制的一段文章,然后采用正则进行切割,中间修改了一些字符串,使其出现的频次高一些,这个接口可以多请求几次,让数据多一点。

正则表达式可以这样处理在这里插入图片描述
请求查询接口

蚂蚁金服一面笔试题_第2张图片

总结

  1. TreeMap的value排序的实现。
  2. 最后返参时要注意选用一个保证插入顺序的Map,这里选用的是LinkedHashMap

扫码关注公众号

蚂蚁金服一面笔试题_第3张图片

你可能感兴趣的:(蚂蚁金服一面笔试题)