他日我若为青帝,报与桃花一处开。

面试时间:2025.3.5

拖了很久才写二面面经(秒过),明天hr面加油

自我介绍

你好,我是应该二面的面试官,然后名字叫做苗富成,是商业化做回归相关系统和架构的。那我们就开始今天面试,还跟以往面试一样,先做个自我介绍。

项目(30min)

  1. 我想问一下那个 Ztimer 和 ROJ 这两个项目是在校的项目吗?还是在网上?比如说找个课程。
  2. Ztimer这个项目现在现状是什么样呢?就是达到你预签那个预期的课题要求了吗
  3. 大概讲一下这个项目,内部大概怎么设计?然后核心的这个定时或驱动模块的设计以及外部。如果是说现在有像你刚才提的有一个新的外部的被驱动方要接入的话,大概是以什么方式?然后分几步。
  4. 所以如果定时的话,目前是,目前你们系统是如果想加入定时的表的话,定时任务话必须得体验两个小时去声明,是吧?
    不是,这里每次激活任务都会触发一次迁移模块
  5. 听起来是不是直接用 Redis 就行了?为什么还要再留一个MySQL?
    回答了mysql是为了兜底而存在。这里面试官说到,redis网络IO的QPS不会很高,因为一分钟内固定60次取扫描zset,我没反应过来,其实也是会高的,当桶比较多的时候,当时我一想他说的好像有点问题,总之就是质疑了这种qps不高的情况下使用缓存没啥必要,我从为了支持多机以及本地缓存的优化上补充了一下
  6. 你这块有提到说模块化和异步化的这个设计思路,大概讲一下。
  7. 所以性能这里边提到的 600 ~ 2, 000 的这个 QPS 实际上指的是调度模块的那个执行的?
    讲了一下压测以及数据库连接池的优化

sql

假设现在有一张表A,里面有一个字段a,是int类型,里面的值不是0就是1,如何只用select语句得到的结果集和表里的数据是相反的,例如如果表里是1,结果返回0,反之

  1. 结果集和1异或^
  2. 1 - 结果集 (最简单的没想出来)
  3. if-else语句

算法

判断一颗树是否是另外一颗树的子结构

注意:

  1. 只要求节点的val相等
  2. 空节点不是任何树的子结构

我的代码:

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.*;

class TreeNode {
int val;
TreeNode left, right;
TreeNode(int val){
this.val = val;
}
}

public class Main {
public static void main(String[] args) {
new Main().solution();
}

private boolean res = false;

public void solution(){
TreeNode t1 = new TreeNode(1); // root1
TreeNode t2 = new TreeNode(2);
TreeNode t3 = new TreeNode(3);
TreeNode t4 = new TreeNode(4);
TreeNode t5 = new TreeNode(5);
TreeNode t6 = new TreeNode(6); // root2
t1.left = t2;
t1.right = t3;
t2.left = t4;
t2.right = t5;
t6.left = t4;
t6.right = t5;
dfs(t1, t6);
System.out.println(res);
}

public void dfs(TreeNode root1, TreeNode root2){
if(root1 == null || root2 == null) return ;
if(root1.left == null && root1.right == null){
if(root2.left == null && root2.right == null && root1.val == root2.val){
res = true;
}
}
if(root1.val == root2.val){
if(root1.left != null && root2.left != null) dfs(root1.left, root2.left);
if(root1.right != null && root2.right != null) dfs(root1.right, root2.right);
}
if(root1.left != null) dfs(root1.left, root2);
if(root2.right != null) dfs(root1.right, root2);
}
}

过了样例,但是面试官说还是有点问题,由于时间原因下去之后再思考解决,主要是我这种写法会出现错位的现象,过了样例还是没能逃过面试官毒辣的眼睛

对应题目:https://leetcode.cn/problems/shu-de-zi-jie-gou-lcof/

正确解答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 这里只给出核心代码模型
class Solution {

public boolean dfs(TreeNode t1, TreeNode t2){
if(t2 == null) return true;
if(t1 == null || t1.val != t2.val) return false;
return dfs(t1.left, t2.left) && dfs(t1.right, t2.right);
}

public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null) return false;
return dfs(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
}

反问

哪里做得不够好,还需要再提高一下?

  1. 项目讨论上偶尔出现没有get到问题的情况,但是经过引导能找对路子
  2. 算法上,可以先思考,和面试官对齐一下需求和逻辑再动笔,逻辑理清楚了再做就很快了

自我评价:

算法还得再练啊,面试官挺好的,本来以为要挂了,结果速通,直接约hr了