用友2023届第二次笔试编程题详解-全部AC

用友的笔试题,几道选择题,包括行测、逻辑推理、数学和计算机相关的知识,编程题两道,难度简单

用友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[][]数组返回即可

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);
}
}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 数字键按从小到大输出
* @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成功

编程题二

image-20220803200121842

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

假设城管目前处于第 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 {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 采用单调递减栈,栈顶元素最小,因为前面楼层低,不会挡住后面;前面高,才会挡住后面,栈顶是最接近当前位置的楼,所以要最小,代表此时栈顶所在位置向某一方向能看到其它楼的楼顶。
* @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成功


用友2023届秋招Java笔试-S2卷
http://example.com/2022/08/03/笔试记录/用友2023届秋招Java笔试-S2卷/
作者
madao33
发布于
August 3, 2022
许可协议