• 用友2023届秋招Java笔试-S2卷-编程题详解


    用友2023届秋招Java笔试-S2卷

    其他的选择和多选不允许跳出

    另外还有一道关于数据库查询的题:

    有两个表,一个学生表,一个成绩表包含学生各个科目的成绩,学生表根据学生id和成绩表关联,要求的是通过两个表联查,得到每个学生的总成绩,并根据总成绩得到学生的评级,分为A、B、C、D、E

    需要用到

    • 多表联查
    • 分组函数求和
    • case when then else end语句
    • order by

    好像评测系统用的是mysql5.X的版本,在自己电脑数据库查询语句没有问题,不知道为什么复制到评测系统出现一些bug,没有时间改这个bug了,直接跳过了

    编程题一

    image-20220803200010103

    题解

    这道题的解决方式暂时只能想到通过HashMap映射对应字符的按键以及按键次数,在初始化的时候初始化一个HashMap,其中key是对应的字符,value是一个两位的整型数字,十位表示的是哪个按键,个位表示按键次数

    这样直接遍历要处理的字符串,得到对应的按键和按键次数,累加每个按键的次数

    为了去除没有按键的结果,将有按键的结果存放在ArrayList中,然后再将其转换为int[][]数组返回即可

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Solution {
        static String[] keys = new String[]{"@!./", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        static Map<Character, Integer> map = new HashMap<>();
        static{
            for (int i = 1; i <= 9; i++) {
                char[] chars = keys[i-1].toCharArray();
                for (int j = 0; j < chars.length; j++) {
                    map.put(chars[j], i*10+j+1);
                }
            }
        }
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 数字键按从小到大输出
         * @param str string字符串 包含英文26个字母和@!./标点符号的字符串
         * @return int整型二维数组
         */
        public int[][] count (String str) {
            // write code here
            int[] res = new int[10];
            char[] chars = str.toCharArray();
            for (int i = 0; i<chars.length; i++) {
                int temp = map.get(chars[i]);
                int key = temp/10;
                int cnt = temp%10;
                res[key] += cnt;
            }
    
            List<int[]> res2 = new ArrayList<int[]>();
            for (int i = 1; i<=9; i++) {
                if (res[i] != 0) {
                    int[] temp = new int[]{i, res[i]};
                    res2.add(temp);
                }
            }
            int[][] ans2 = new int[res2.size()][2];
            for (int i = 0; i < res2.size(); i++) {
                ans2[i][0] = res2.get(i)[0];
                ans2[i][1] = res2.get(i)[1];
            }
            return ans2;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    通过全部测试案例,AC成功

    编程题二

    image-20220803200121842

    这道题是典型的双指针,虽然说是双指针,但是感觉也像是暴力循环和模拟了

    假设城管目前处于第 i 栋楼,那么他可以看到的楼顶除了当前第 i 栋楼,尽可能有两种情况:

    • 向前看,也就是(0, i-1),从第 i-1 栋楼开始,设置指针 left 指向向前看的楼,设置一个之前最高楼层的高度 leftmax,初始为0

      • 如果当前楼高度大于 leftmax,说明该栋楼在城管可见,计数加1,并更行 leftmax 为当前楼高度
      • 如果当前楼高度小于等于leftmax,说明不可见,跳过该楼层到一下层楼

      向前看则表示left--

    • 向后看和向前看基本类似,同样设置一个向后看的指针 right,向后看之前最高楼层的高度 rightmax,初始也为零,不过向后看是 right++

    import java.util.Arrays;
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 采用单调递减栈,栈顶元素最小,因为前面楼层低,不会挡住后面;前面高,才会挡住后面,栈顶是最接近当前位置的楼,所以要最小,代表此时栈顶所在位置向某一方向能看到其它楼的楼顶。
         * @param heights int整型一维数组 n座楼的楼层高度
         * @return int整型一维数组
         */
        public int[] findBuilding (int[] heights) {
            int n = heights.length;
            int[] ans = new int[n];
            Arrays.fill(ans, 1);
            for (int i = 0; i < n; i++) {
                int left = i-1, right = i+1;
                int leftmax = 0, rightmax = 0;
                while(left >= 0) {
                    if (heights[left] > leftmax) {
                        leftmax = heights[left];
                        ans[i]++;
                    }
                    left--;
                }
                while(right < n) {
                    if (heights[right] > rightmax) {
                        rightmax = heights[right];
                        ans[i]++;
                    }
                    right++;
                }
            }
            return ans;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    通过所有测试案例,AC成功

    个人博客网站更新的更加频繁一点,其他相关的笔试和面试的笔记可以查看我的个人博客网站:madao33’s blog

  • 相关阅读:
    给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组
    技术分享 | 如何使用代理配置快速定位接口测试脚本问题?
    从零开始设计一个共识算法——一场没有硝烟的战争
    linux下的版本控制器git
    【测试开发】基于 node 的 puppeteer 环境搭建(1/2)
    CSS前端入门(第二天)选择器
    安装vite报错:Cannot use import statement outside a module
    【C++】STL —— list的基本使用
    高压放大器在制备功能材料中的应用
    机器学习(十三):支持向量机(SVM)
  • 原文地址:https://blog.csdn.net/qq_36178962/article/details/126148651