2020农行软开实习的笔试题

2020农行软开实习的笔试题

// 注意:边界条件+判空

一. 编写程序计算10个正整数的平均数,找出这10个数中雨平均值的距离最近的三个数(差值的绝对值)。以距离的大小对这三个数进行排序并输出(距离小的先输出)

输入:[33,44,61,2,36,42,56,81,11,17]

输出:[36,42,33]

思路:

  1. 算平均值。

  2. 用hashmap,每个数减去平均值,取绝对值,存入key。value就存那个数就行。

  3. 用一个ArrayList存一下keys,并排序。

  4. 把排序后的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); // 转换为三进制
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值