题来源链接:华为笔试
(一)题目1:员工评选
投票选举最佳员工,选出得票数最高的员工,若:
1)票数相同,按名字的字典序排序;
2)票数相同且名字有包含关系(Tom和Tomy),则名字短者在前。
- 输入:一行,名字之间用
,
隔开,如:Tom,Lucy,Tom,Jack,Rose
;- 输出:最佳员工的名字,如:
Tom
;
public class pra1 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String s = scan.next();
String[] names = s.split(",");
Map<String,Integer> votes = new HashMap<>();
for(String name : names){
votes.put(name,votes.getOrDefault(name,0) + 1);
}
List<Map.Entry<String,Integer>> list = new ArrayList<>(votes.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
@Override
public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2) {
if(o2.getValue() != o1.getValue()){
return o2.getValue() - o1.getValue();
}else if(o1.getKey().contains(o2.getKey()) || o2.getKey().contains(o1.getKey())){
return o1.getKey().length() - o2.getKey().length();
}else{
return o1.getKey().compareToIgnoreCase(o2.getKey());
}
}
});
// Arrays.sort(names,new Comparator<String>(){
// public int compare(String o1,String o2){
// if(votes.get(o1) != votes.get(o2)){
// return votes.get(o2) - votes.get(o1);
// }else if(o1.contains(o2) || o2.contains(o1)){
// return o1.length() - o2.length();
// }else{
// return o1.compareTo(o2);
// }
// }
// });
System.out.println(list.get(0).toString().split("=")[0]);
for (int i = 0; i < list.size(); i++) {
String name = list.get(i).toString();
System.out.println(name);
}
}
}
(二)题目2:字符匹配——没看懂啥意思的题目
给出一个待匹配串,一个表示若干寄存器的固定格式的母串,寄存器格式:
xxx[name:xxx,mask:xxx,val:xxx]
,母串有多个寄存器字符串通过,
相连,匹配规则:1)待匹配串和寄存器编号相同;2)待匹配串的name、mask、val和母串中的某个寄存器相同。
(三)题目3:最长调用链——这题是有思路的,不过因为没有示例,我有点不太确定自己的递归结束条件设置对不对
给出n个函数,每个函数的权值,以及每个函数可以调用的其他函数,输出权值最大的调用链的权值。
输入:第一行,x a b c d ...x代表函数的个数,后边的x个数代表每个函数可以调用的其他函数个数;
接下来x行,每行如z y a b c ...z代表函数编号,y代表函数权值,后面的若干数代表函数x可以调用的函数编号;
输出:最大权值;