当前位置: 首页 > 面试经验 >

捡了个大便宜,哔哩哔哩秋招笔试面经 - 2024后端开发

优质
小牛编辑
87浏览
2023-08-31

捡了个大便宜,哔哩哔哩秋招笔试面经 - 2024后端开发

笔试系统:牛客网

9 道单选 (2分或3分每题)

11道多选 (3分每题)

3道大题(1道 SQL 10分, 2道编程题 每题20分) 共 50分

UP主筛选 (10分)

请在UP主视频数据表中,筛选发布视频平均时长大于300秒的UP主,按UP主视频平均时长倒序,视频ID升序,返回第3行到6行的视频ID。

输入

CREATE TABLE `uploader_video_record`  (
  `video_id` bigint PRIMARY KEY,
  `uploader_id` bigint,
  `video_duration` int
);

INSERT INTO `uploader_video_record` 
VALUES 
(1, 101, 60),
(2, 102, 600),
(3, 103, 310),
(4, 101, 120),
(5, 104, 3200),
(6, 102, 330),
(7, 103, 290),
(8, 105, 290),
(9, 101, 180),
(10, 103, 320);

输出

video_id

6

3

7

10

说明

UP主视频数据表中,发布视频平均时长大于300秒的UP主ID为102、103、104。将这些UP主对应视频数据,按UP主视频平均时长倒序、视频ID升序,取第3行到6行的视频ID为6、3、7、10。

题解

SELECT video_id
FROM (
  SELECT
    video_id,
    uploader_id,
    video_duration,
    (SELECT AVG(video_duration) FROM uploader_video_record sub WHERE sub.uploader_id = main.uploader_id) AS avg_duration
  FROM uploader_video_record main
) AS avg_data
WHERE avg_duration > 300
ORDER BY avg_duration DESC, video_id ASC
LIMIT 4 OFFSET 2;

两个字符串的最小ASCII删除和(20分)

力扣原题: **********************

给定两个字符串s1s2,返回 使两个字符串相等所需删除字符的 ASCII 值的最小和

示例 1:

输入: s1 = "sea", s2 = "eat"
输出: 231
解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。
在 "eat" 中删除 "t" 并将 116 加入总和。
结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。

示例 2:

输入: s1 = "delete", s2 = "leet"
输出: 403
解释: 在 "delete" 中删除 "dee" 字符串变成 "let",
将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。
结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403 。
如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。

提示:

  • 0 <= s1.length, s2.length <= 1000
  • s1s2 由小写英文字母组成

题解

动态规划

class Solution {
    public int minimumDeleteSum(String s1, String s2) {
        int m = s1.length(), n = s2.length();
        // dp[i][j] 表示使字符串 s1[0, i) 和字符串 s2[0, j) 相同最小的删除和
        int[][] dp = new int[m + 1][n + 1];

        // 当其中一个字符串为空时,使两个字符串相同就必须删除所有的字符
        for (int i = 0; i < m; i++) dp[i + 1][0] = dp[i][0] + s1.charAt(i);
        for (int j = 0; j < n; j++) dp[0][j + 1] = dp[0][j] + s2.charAt(j);

        for (int i = 0; i < m; i++) {
            int code1 = s1.charAt(i);
            for (int j = 0; j < n; j++) {
                int code2 = s2.charAt(j);

                dp[i + 1][j + 1] = Math.min(dp[i + 1][j] + code2, dp[i][j + 1] + code1);
                if (code1 == code2) {
                    dp[i + 1][j + 1] = dp[i][j];
                }
            }
        }

        return dp[m][n];
    }
}

最长同值路径(20分)

力扣原题: ************

给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。

两个节点之间的路径长度 由它们之间的边数表示。

示例 1:

输入:root = [5,4,5,1,1,5]
输出:2

示例 2:

输入:root = [1,4,5,4,4,5]
输出:2

提示:

  • 树的节点数的范围是 [0, 104]
  • -1000 <= Node.val <= 1000
  • 树的深度将不超过 1000

题解

DFS

class Solution {
    int max = 0;

    public int longestUnivaluePath(TreeNode root) {
        this.max = 0;
        dfs(root);
        return max;
    }

    public int dfs(TreeNode node) {
        if (node == null) return 0;

        // subMax 表示本节点的其中最长的一条路径值
        // tot 表示经过当前节点, 从左节点到右子节点最长的同值子路径
        int subMax = 0, tot = 0, l = dfs(node.left), r = dfs(node.right);
        if (node.left != null && node.val == node.left.val) {
            tot = l + 1;
            subMax = l + 1;
        }

        if (node.right != null && node.val == node.right.val) {
            tot += r + 1;
            subMax = Math.max(subMax, r + 1);
        }

        this.max = Math.max(max, tot);

        return subMax;
    }
}

如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。

#面经##秋招##程序员##java##哔哩哔哩#
 类似资料: