经典面试题-大厂SQL题目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典面试题-大厂SQL题目相关的知识,希望对你有一定的参考价值。

参考技术A 正确答案:

正确答案:

给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

正确答案:

Customers 表:

Orders 表:

例如给定上述表格,你的查询应返回:

正确答案:

例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

正确答案:

或者

例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

正确答案:

例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。

正确答案:

示例:

假如数据输入的是上表,则输出结果如下:

注意:
如果学生人数是奇数,则不需要改变最后一个同学的座位。
正确答案:

例如,根据上述给定的 Weather 表格,返回如下 Id:

正确答案:

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。

Department 表包含公司所有部门的信息。

编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

正确答案:

表1: Person

PersonId 是上表主键

表2: Address

AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

FirstName, LastName, City, State

正确答案:

注意,您必只能写一个 Update 语句,请不要编写任何 Select 语句。
例如:

运行你所编写的更新语句之后,将会得到以下表:

正确答案:

这里有张 World 表

如果一个国家的面积超过300万平方公里,或者人口超过2500万,那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
例如,根据上表,我们应该输出:

正确答案:

Id 是这个表的主键。

例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

正确答案:

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id 。

Department 表包含公司所有部门的信息。

编写一个 SQL 查询,找出每个部门工资前三高的员工。例如,根据上述给定的表格,查询结果应返回:

正确答案

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

正确答案:

例如,下表 cinema:

对于上面的例子,则正确的输出是为:

正确答案:

请列出所有超过或等于5名学生的课。
例如,表:

应该输出:

Note:
学生在每个课中不应被重复计算。

正确答案:

Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。

写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日 期间非禁止用户的取消率。基于上表,你的 SQL 语句应返回如下结果,取消率(Cancellation Rate)保留两位小数。

正确答案

示例:

根据以上输入,你的查询应返回以下结果:

说明:所有电子邮箱都是小写字母。

正确答案:

请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。
例如,表 stadium:

对于上面的示例数据,输出为:

Note:
每天只有一行记录,日期随着 id 的增加而增加。

正确答案:

多思路深度剖析经典面试题最长回文子串

前言

大家好,我是程序员小熊,来自大厂的程序猿。最长回文子串是面试中常考的题目,尤其是一些互联网大厂,像亚马逊、微软、脸书、字节和腾讯等考过这道题。

本文提供四种解题思路三种解法,将本题解法的时间复杂度由 O(n^3) 一步步降为 O(n) ,供大家参考,希望对大家有所帮助。

题目

给你一个字符串 s,找到 s 中最长的回文子串。

 示例

解题思路

本题要求的是最长回文子串,必须先明确两个概念。

回文串从左向右读跟从右向左读都一样的字符串。例如 “level”或者“noon”等等。

子串:原始字符串中任意个连续的字符组成的子序列。

由于题目提示 1 <= s.length <= 1000,因此设计一个 O(n^2) 的算法是合理的。因为 O(n^2) 的算法可以在 1s 内处理大约 10^4 级别的数据;并且从示例1中可以知道,如果字符串存在多个最长回文子串,只需要输出一个即可。

暴力法

以字符串 "abba" 为例子,如下动图所示。

暴力法动图

要求字符串的最长回文子串,只需要先找出最长回文子串的起始位置,再求出最长回文子串的长度即可。

因此可以通过两层遍历枚举长度大于等于2且超过当前得到的最长回文子串长度的子串,再加一层判断子串是否是回文串的遍历,就可求出给定字符串的最长回文子串。

Show me the Code

java

 1 /* 验证子串 s[left...right]是否为回文子串 */
 2 boolean isPalindrome(char[] charArray, int left, int right) {
 3     while (left < right) {
 4         if (charArray[left] != charArray[right]) {
 5             return false;
 6         }
 7         left++;
 8         right--;
 9     }
10 
11     return true;
12 } 
13 
14 String longestPalindrome(String s) {
15     int len = s.length();
16     /* 长度少于 2 的字符串的最长回文子串是其自身 */
17     if (len < 2) {
18         return s;
19     }
20 
21     int maxLen = 1;   // 记录最长回文子串的长度
22     int start = 0;    // 记录最长回文子串的起始位置
23     char[] charArray = s.toCharArray();
24     for (int i = 0; i < len - 1; i++) {
25         for (int j = i + 1; j < len; j++) {
26             /* 回文子串 s[i...j] 的长度超过当前最长回文子串长度 */
27             if (j - i + 1 > maxLen && isPalindrome(charArray, i, j)) {
28                 /* 更新最长回文子串的长度 */
29                 start = i;
30                 maxLen = j - i + 1;
31             }
32         }
33     }
34 
35     return s.substring(start, start + maxLen);
36 }
View Code

 

复杂度分析

时间复杂度:三层遍历 O(n^3)

空间复杂度:没有开辟额外空间 O(1)

动态规划

回文串具有天然状态转移性,一个长度大于 2 的回文串,去掉首尾两头之后,剩余的部分依然是回文串。

情况一:如果一个子串首尾两头的字符不相同,则该子串不是回文串。如下图示。

回文串判断1

情况二:如果一个子串首尾两头的字符相同,则去掉首尾两头的字符,继续判断去掉后的子串,直至子串的首尾两头的字符不相同或子串为空。如下动图示。

回文串判断2

也就是说一个子串首尾两头的字符相同去掉首尾两头的字符后剩余的子串是否是回文串决定原子串是否是回文串

状态:dp[i][j] 表示子串 s[i...j] 是否为回文子串。 

状态转移方程

边界条件:[i + 1...j - 1]不成立(构成区间)

初始化:单个字符一定是字符串 dp[i][j] = true。

输出:状态为 true 时,记录当前最长回文子串的起始位置和长度,填完表后截取字符串。

举例 以字符串 "abcba" 为例子,如下动图示,表格中的 dp[i][j] 也可参考它左下方的值填写。

状态转移表

Show me the Code

java

 1 String longestPalindrome(String s) {
 2     int len = s.length();
 3     if (len < 2) {
 4         return s;
 5     }
 6 
 7     int start = 0;
 8     int maxLen = 1;
 9 
10     /* dp[i][j]:s[i...j] 是否是回文串 */
11     boolean[][] dp = new boolean[len][len];
12     for (int i = 0; i < len; i++) {
13         dp[i][i] = true;
14     }
15 
16     char[] charArray = s.toCharArray();
17     for (int j = 1; j < len; j++) {
18         for (int i = 0; i < j; i++) {
19             if (charArray[i] != charArray[j]) {
20                 dp[i][j] = false;
21             } else {
22                 if (j - i < 3) {
23                     dp[i][j] = true;
24                 } else {
25                     dp[i][j] = dp[i + 1][j - 1];
26                 }
27             }
28 
29             /* s[i...j] 是回文串,记录当前最长回文串长度和起始位置 */
30             if (dp[i][j] && j - i + 1 > maxLen) {
31                 maxLen = j - i + 1;
32                 start = i;
33             }
34         }
35     }
36 
37     return s.substring(start, start + maxLen);
38 } 
View Code

 

利用状态转移方程,快速判断一个子串是否是回文串,每一步计算都尽可能地利用之前计算的结果(保存的),空间换时间

复杂度分析

时间复杂度O(n^2)

空间复杂度O(n^2)

中心扩散法

回文串的枚举可以从两边开始,也可以从中间开始,所以可以枚举所有可能的回文子串的中心位置

由于奇/偶数长度的回文子串的中心位置不一样,所以枚举时需要考虑回文子串长度是奇数还是偶数,如下图示。

偶数回文串 奇数回文串

举例

以奇数长度的字符串 "abcba" 为例子,中心扩散如下动图示,

奇数回文串中心扩散动图

Show me the Code

C++

 1 /* s[left] 和 s[right] 想两断扩散, 求以 s[left] 和 s[right] 为中心的最长回文串*/
 2 string longestPalindromeHelper(string s, int left, int right) { 
 3     while (left >= 0 && right < s.length() && s[left] == s[right]) {
 4         left--;
 5         right++;
 6     }
 7     
 8     return s.substr(left + 1, right - left - 1);
 9 }
10 
11 string longestPalindrome(string s) {
12     int len = s.length();
13     if (len < 2) {
14         return s;
15     }
16 
17     string res;
18     for (int i = 0; i < len; i++) {
19         /* 以s[i]作奇数回文子串的的回文中心向两边扩散,得到的最长回文子串*/
20         string s1 = longestPalindromeHelper(s, i, i);
21         /* 以s[i]、s[i + 1] 分别作偶数回文子串的的回文中心向两边扩散,得到的最长回文子串*/
22         string s2 = longestPalindromeHelper(s, i, i + 1);
23         res = res.size() > s1.size() ? res : s1;
24         res = res.size() > s2.size() ? res : s2;
25     }
26 
27     return res;
28 }
View Code

 

复杂度分析

时间复杂度O(n^2),枚举中心位置的个数是 2(n - 1),每次向两边扩散检测试服是回文子串。

空间复杂度O(1)

Manacher 算法

通过将原始字符串进行预处理(用不在输入字符串中的字符隔开),使得奇/偶数长度的回文串的性质统一表示。该算法专门用于查找最长回文子串,其时间复杂度为 O(n)

由于绝大多数笔/面试不要求掌握次算法,所以这里就不再介绍了,感兴趣的童鞋,可以查阅相关资料进一步了解。

 

以上是关于经典面试题-大厂SQL题目的主要内容,如果未能解决你的问题,请参考以下文章

大厂经典高频面试题体系化集合,先收藏了

多思路深度剖析经典面试题最长回文子串

面试必备:MySQL经典50题~学会SQL面试不在话下

50道大厂经典Spring面试题,你能答出来几题?

最强最全面的大数据SQL经典面试题(由31位大佬共同协作完成)

大厂面试题