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){}方法体内的实现代码即可。