笔试系统:牛客网
9 道单选 (2分或3分每题)
11道多选 (3分每题)
3道大题(1道 SQL 10分, 2道编程题 每题20分) 共 50分
请在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;
力扣原题: **********************
给定两个字符串s1
和 s2
,返回 使两个字符串相等所需删除字符的 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
s1
和 s2
由小写英文字母组成动态规划
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];
}
}
力扣原题: ************
给定一个二叉树的 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##哔哩哔哩#