HashMap和LinkedHashMap区别之百度&中兴编程题实例

amcat中百度和中兴都考过一道对员工工资进行排序的编程题。题目详情如下:

某公司中有N名员工。给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资。他按照工资的频次降序排列,即给定清单中所有频次较高的工资将在频次较低的工资之前出现。如果相同数量的员工都有相同的工资,则将按照给定清单中该工资第一次出现的顺序排列。

输入:该函数/方法的输入包括两个参数num(一个整数,表示员工的人数)和salaries(一个正整数列表,表示N名员工的工资)。

输出:返回一个正整数列表,该列表按照员工工资的频次排序。

约束条件

1<=num<=10^5

1<=salaries[i]<=10^9

0=<i<num

用例:10,[20,40,26,25,40,20,40,20,40,25]

输出:40 40 40 40 20 20 20 25 25 26

注:amcat编译器中,只需要写方法体就行,方法体中涉及的参数系统默认输入正确,无需使用Scanner获取从键盘的输入并解析。跟牛客网的不一样不一样不一样!!!

运行期间犯了一个小错误,导致17个用例只跑通了8个,之后发现了问题,改正后解决了。主要是hashmap和linkedhashmap的区别。

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复即覆盖),但允许值重复HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。遍历时,取得数据的顺序是完全随机的LinkedHashMap是HashMap的一个子类,其内部有一个双向链表,保存了记录的插入顺序。在用Iterator遍历LinkedHashMap时,也是按照插入顺序迭代,而且迭代比HashMap快。

代码如下(全):
 

import java.util.*;

import java.util.Map.Entry;

/**

* Created by ZhangAnmy on 18/9/10.

* 用例:10,[20,40,26,25,40,20,40,20,40,25]

结果:40 40 40 40 20 20 20 25 25 26

*/

public class ExamTest 
{
    public static void main(String[] args)
    {
        Scanner reader = new Scanner(System.in);
        String line = reader.nextLine();

        int numIndex = line.indexOf(",");
        int num = Integer.parseInt(line.substring(0,numIndex));

        int salaryBeginIndex = line.indexOf("[");
        int salaryEndIndex = line.indexOf("]");

        String salaryArr = line.substring(salaryBeginIndex+1,salaryEndIndex);
        String[] salaryInfo = salaryArr.split(",");
        int[] salaries = new int[num];

        for(int i=0;i<num;i++)
        {
            salaries[i] = Integer.parseInt(salaryInfo[i].trim());
        }

        Solution sl = new Solution();
        List<Integer> ls = sl.salaryfrequeny(num,salaries);
        
        for(int i=0;i<ls.size();i++)
        {
            if(i!=ls.size()-1)
            {
                System.out.print(ls.get(i)+" ");
            }
            else
            {
                System.out.print(ls.get(i));
            }
        }
    }
}

class Solution
{
    List<Integer> salaryfrequeny(int num,int[] salaries)
    {
        List<Integer> ls = new ArrayList<Integer>();

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

        int frequency = 0;

        for(int i=0;i<num;i++)
        {
            if(map.get(salaries[i]) != null )
            {
                frequency = map.get(salaries[i]) + 1;
                map.put(salaries[i],frequency);
            }
            else
            {
                map.put(salaries[i],1);
            }
        }

        List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer,Integer>>(map.entrySet());

        Collections.sort(list,new Comparator<Map.Entry<Integer,Integer>>()
        {
            public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2)
            {
                return o2.getValue().compareTo(o1.getValue());
            }
        });

        for(Map.Entry<Integer,Integer> mapping:list)
        {
            int times = mapping.getValue();
            for(int i=0;i<times;i++)
            {
                ls.add(mapping.getKey());
            }
        }
        return ls;
    }
}

amcat中只需要写List<Integer> salaryfrequeny(int num,int[] salaries){}方法体内的实现代码即可。

猜你喜欢

转载自blog.csdn.net/m0_37568814/article/details/82710082