用友的笔试题,几道选择题,包括行测、逻辑推理、数学和计算机相关的知识,编程题两道,难度简单
用友2023届秋招Java笔试-S2卷
其他的选择和多选不允许跳出
另外还有一道关于数据库查询的题:
有两个表,一个学生表,一个成绩表包含学生各个科目的成绩,学生表根据学生id和成绩表关联,要求的是通过两个表联查,得到每个学生的总成绩,并根据总成绩得到学生的评级,分为A、B、C、D、E
需要用到
- 多表联查
- 分组函数求和
- case when then else end语句
- order by
等
好像评测系统用的是mysql5.X的版本,在自己电脑数据库查询语句没有问题,不知道为什么复制到评测系统出现一些bug,没有时间改这个bug了,直接跳过了
编程题一
题解
这道题的解决方式暂时只能想到通过HashMap
映射对应字符的按键以及按键次数,在初始化的时候初始化一个HashMap
,其中key
是对应的字符,value
是一个两位的整型数字,十位表示的是哪个按键,个位表示按键次数
这样直接遍历要处理的字符串,得到对应的按键和按键次数,累加每个按键的次数
为了去除没有按键的结果,将有按键的结果存放在ArrayList
中,然后再将其转换为int[][]
数组返回即可
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
| 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); } } }
public int[][] count (String str) { 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成功
编程题二
这道题是典型的双指针,虽然说是双指针,但是感觉也像是暴力循环和模拟了
假设城管目前处于第 i 栋楼,那么他可以看到的楼顶除了当前第 i 栋楼,尽可能有两种情况:
向前看,也就是(0, i-1),从第 i-1 栋楼开始,设置指针 left 指向向前看的楼,设置一个之前最高楼层的高度 leftmax,初始为0
- 如果当前楼高度大于 leftmax,说明该栋楼在城管可见,计数加1,并更行 leftmax 为当前楼高度
- 如果当前楼高度小于等于leftmax,说明不可见,跳过该楼层到一下层楼
向前看则表示left--
向后看和向前看基本类似,同样设置一个向后看的指针 right,向后看之前最高楼层的高度 rightmax,初始也为零,不过向后看是 right++
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
| import java.util.Arrays;
public class Solution {
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成功