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

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

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

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

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

需要用到

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

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

编程题一

用友2023届秋招Java笔试-S2卷-编程题详解_第1张图片

题解

这道题的解决方式暂时只能想到通过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;
    }
}

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

编程题二

用友2023届秋招Java笔试-S2卷-编程题详解_第2张图片

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

假设城管目前处于第 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;
    }
}

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

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

你可能感兴趣的:(笔试面试记录,java,开发语言)