2020农行软开实习的笔试题
// 注意:边界条件+判空
一. 编写程序计算10个正整数的平均数,找出这10个数中雨平均值的距离最近的三个数(差值的绝对值)。以距离的大小对这三个数进行排序并输出(距离小的先输出)
输入:[33,44,61,2,36,42,56,81,11,17]
输出:[36,42,33]
思路:
-
算平均值。
-
用hashmap,每个数减去平均值,取绝对值,存入key。value就存那个数就行。
-
用一个ArrayList存一下keys,并排序。
-
把排序后的list的前三个元素当成key,去map里get。
注意的点:list的操作涉及add,get。
用map.keySet去遍历,foreach的形式。
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().trim().split(" ");
Integer[] res = new Integer[s.length];
for (int i = 0; i < s.length; i++) {
res[i] = Integer.parseInt(s[i]);
}
Integer[] arr = findn(res);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static Integer[] findn(Integer[] arr){
Integer[] res = new Integer[3]; // 存储结果
int sum = 0;
int ave = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
ave = sum / arr.length;
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
map.put(Math.abs(arr[i] - ave),arr[i]);
}
ArrayList<Integer> list = new ArrayList<>();
for(Integer key : map.keySet()){
list.add(key);
}
Collections.sort(list);
for (int i = 0; i < 3; i++) {
res[i] = map.get(list.get(i));
}
return res;
}
方法二:重写HashMap,按Value排序
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().trim().split(" ");
int[] res = new int[s.length];
for (int i = 0; i < s.length; i++) {
res[i] = Integer.parseInt(s[i]);
}
// System.out.println(minThree(res).toString());
}
// 方法一:采用Hashmap
public static ArrayList<Integer> minThree(int[] s){
ArrayList<Integer> arr = new ArrayList<>();
if (s == null || s.length == 0){
return arr;
}
int result = 0;
for (int i = 0; i < s.length; i++) {
result += s[i];
}
int avg = result/s.length;
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < s.length; i++) {
map.put(s[i],Math.abs(s[i] - avg));
}
List<Map.Entry<Integer,Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o1.getValue()-o2.getValue();
}
});
for (int i = 0; i < 3; i++) {
arr.add(list.get(i).getKey());
}
return arr;
}
二. 求数学表达式运算结果
加减直接入栈,乘除先出栈,运算,再入栈。
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
System.out.println(method(s));
}
public static int method (String s){
if (s == null || s.length() == 0){
return 0;
}
int n = 0;
char op = '+';
s = s.replace(" ","");
Stack<Integer> num = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isDigit(c)) {
n = n * 10 + (c - '0');
}
if (!Character.isDigit(c) || i == s.length()-1){
int pre;
switch (op){
case '+': num.push(n);
break;
case '-': num.push(-n);
break;
case '*': pre = num.pop();
num.push(pre*n);
break;
case '/':pre = num.pop();
num.push(pre/n);
break;
}
op = c;
n = 0;
}
}
int res = 0;
while (!num.isEmpty()){
res += num.pop();
}
return res;
三. 三进制求和 12112 + 121
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().trim().split(" ");
System.out.println(threeSum(s[0],s[1]));
}
public static String threeSum(String s1,String s2){
int a1 = Integer.parseInt(s1,3); // 转换为10进制
int a2 = Integer.parseInt(s2,3);
int sum = a1+a2; // 计算
return Integer.toString(sum,3); // 转换为三进制