微众银行Java笔试
20道选择,3道算法。
1.征服山顶
传入一个数组,每个位置代表山的高度。
当你爬上山,周围没有比你高的山,你的征服感就加一。
解法:
遍历两次。
第一次遍历找出最高的山。
第二次遍历,每碰到跟最高山相等的山,征服感就加一。
package webank;
import java.util.Scanner;
class Solution{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[]h = new int[n];
for(int i = 0;i<n;i++){
h[i] = input.nextInt();
}
System.out.println(calculateHappy(h));
input.close();
}
public static int calculateHappy(int[]h){
int res = 0;
int max = 0;
for(int i = 0;i<h.length;i++){
if(h[i]>max){
max = h[i];
}
}
for(int i = 0;i<h.length;i++){
if(h[i]==max){
res++;
}
}
return res;
}
} 2.积水
你有n个蓄水池,蓄水池还有m个通道。求下雨后的蓄水池。
这题主要是输入输出耗费了比较多的时间。
而且我感觉我的解法也不好。
运用了大量的集合来做。求大神指点。
package webank;
import java.util.*;
public class Main2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s1 = input.nextLine();
String ss1[] = s1.split(" ");
int n = Integer.parseInt(ss1[0]);
int m = Integer.parseInt(ss1[1]);
float []p = new float[n];
String s2 = input.nextLine();
String ss2[] = s2.split(" ");
for(int i = 0;i<n;i++){
p[i] = Integer.parseInt(ss2[i]);
}
List<Set<Integer>> list = new ArrayList<>();
for(int i = 0;i<m;i++){
String s3 = input.nextLine();
String ss3[] = s3.split(" ");
int t1 = Integer.parseInt(ss3[0])-1;
int t2 = Integer.parseInt(ss3[1])-1;
if(i==0){
Set<Integer> set0= new HashSet<>();
set0.add(t1);
set0.add(t2);
list.add(set0);
}
for(Set<Integer> set:list){
if(set.contains(t1)||set.contains(t2)){
set.add(t1);
set.add(t2);
}else{
Set<Integer> sett= new HashSet<>();
sett.add(t1);
sett.add(t2);
list.add(sett);
break;
}
}
}
for(Set<Integer> set:list){
List<Integer>l = new ArrayList<>();
float temp = 0;
for(int i:set){
l.add(i);
temp+=p[i];
}
temp = temp/l.size();
temp = Math.round(temp*100);
temp = temp/100;
for(int i = 0;i<l.size();i++){
p[l.get(i)] = temp;
}
}
System.out.println(p);
}
}
3.拼积木
在第二题耗费了太多时间。。
我记得我之前在别人那边见过,不过没写,没想到又出现了。。。。
总结:1.两道题目应该能写出来,不过第二题的Math.round()的处理方法不好,导致最后结果没有通过。其实也是因为自己解法不好,耗费了大量时间。
2.其他家的真题也要好好把握,可能会出现重复。
3.有背景的题目,读懂题目,写好输入输出是关键。
