挑战SQL经典题(一)

Posted

tags:

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

参考技术A 建表语句:

表说明:
student(sid,sname,sage,ssex) 学生表
course(cid,cname,tid) 课程表
sc(sid,cid,score) 成绩表
teacher(tid,tname) 教师表

问题:
1、查询“1”课程比“2”课程成绩高的所有学生的学号;(3号-张三)

2、查询平均成绩大于60分的同学的学号和平均成绩;(1、2、3、4号)

3、查询所有同学的学号、姓名、选课数、总成绩;

4、查询姓“李”的老师的个数;(0个)

5、查询没学过“叶平”老师课的同学的学号、姓名; (4号-李四)

6、查询学过“1”并且也学过编号“2”课程的同学的学号、姓名;
(1号-刘一 2号-钱二 3号-张三 6号-赵六 除了4号和5号)---考查EXISTS

7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; (除了4号)

8、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;
(3号-张三)

9、查询所有课程有成绩小于60分的同学的学号、姓名;
(1号、3号、5号、6号 除了2号和4号)

10、查询没有学全所有课的同学的学号、姓名; (4号、5号、6号)

11、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名; (All)

12、查询跟学号为“1”的同学学的所有课一样的其他同学学号和姓名; (2号和3号)

13、把“sc”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩; (61.4)

14、删除学习“叶平”老师课的SC表记录;

15、向sc表中插入一条记录,要求符合以下条件:没有上过编号“3”课程的同学学号、2号课的平均成绩;(6号童鞋没有上过3号课程)

16、按平均成绩从高到低显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分(待更正 语句有错)

17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

18、按各科平均成绩从低到高和及格率的百分数从高到低顺序

19、查询如下课程平均成绩和及格率的百分数(用"1行"显示):
语文-1、数学-2、英语-3、物理-4

20、查询不同老师所教不同课程平均分从高到低显示

21、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]

22、查询学生平均成绩及其名次

23、查询各科成绩前三名的记录:(不考虑成绩并列情况)---------SQL不识别TOP

24、查询每门课程被选修的学生数

25、查询出只选修了一门课程的全部学生的学号和姓名

26、查询男生、女生人数

27、查询姓“张”的学生名单

28、查询同名同姓学生名单,并统计同名人数

29、查询平均成绩大于85的所有学生的学号、姓名和平均成绩

30、查询“物理”课分数不及格的学生姓名和分数

31、查询所有学生的选课情况;

32、查询课程的成绩在80分以上的学生姓名、课程名称和分数;

33、查询选修“周磊”老师所授课程的学生中,成绩最高的学生姓名及其成绩(李四-93)

34、查询不同课程成绩相同的学生的学号、课程号、学生成绩

35、查询两门以上课程大于80分的同学的学号及其平均成绩

36、检索“4”课程分数小于60,按分数降序排列的同学学号

寒假每日一题棋盘挑战(个人练习)详细题解+推导证明(第十六天)

文章目录

前言

今天是经典的深度优先搜索问题,即八皇后问题。

作为经典问题,我发现了一种新的写法,不需要开二维数组即可完成。

题目

给定一个 N×N 的棋盘,请你在上面放置 N 个棋子,要求满足:

每行每列都恰好有一个棋子
每条对角线上都最多只能有一个棋子

    1   2   3   4   5   6
  -------------------------
1 |   | O |   |   |   |   |
  -------------------------
2 |   |   |   | O |   |   |
  -------------------------
3 |   |   |   |   |   | O |
  -------------------------
4 | O |   |   |   |   |   |
  -------------------------
5 |   |   | O |   |   |   |
  -------------------------
6 |   |   |   |   | O |   |
  -------------------------

上图给出了当 N=6 时的一种解决方案,该方案可用序列 2 4 6 1 3 5 来描述,该序列按顺序给出了从第一行到第六行,每一行摆放的棋子所在的列的位置。

请你编写一个程序,给定一个 N×N 的棋盘以及 N 个棋子,请你找出所有满足上述条件的棋子放置方案。

输入格式

  • 共一行,一个整数 N。

输出格式

  • 共四行,前三行每行输出一个整数序列,用来描述一种可行放置方案,序列中的第 i 个数表示第 i 行的棋子应该摆放的列的位置。
  • 这三行描述的方案应该是整数序列字典序排在第一、第二、第三的方案。
  • 第四行输出一个整数,表示可行放置方案的总数。

数据范围

  • 6 ≤ N ≤ 13 6≤N≤13 6N13
输入样例:
6
输出样例:
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

详细题解

写法1

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 15;

int n;
bool col[N], dg[N*2], udg[N*2];
int path[N], ans;

void dfs(int x)

    if(x > n)
    
        ++ ans;
        if (ans <= 3)
        
            for (int i = 1; i <= n; ++ i )
                cout << path[i] << " ";
            cout << endl;
        
        return ;
    
    
    for (int y = 1; y <= n; ++ y )
        if (!col[y] && !dg[x - y + n] && !udg[x + y])
        
            path[x] = y;
            col[y] = dg[x - y + n] = udg[x + y] = true;
            dfs(x + 1);
            
            path[x] = 0;
            col[y] = dg[x - y + n] = udg[x + y] = false;
        


int main()

    cin >> n;
    dfs(1);
    cout << ans << endl;
    
    return 0;

毫无疑问,这是我个人觉得很有想象力的一种写法,使用新的表示方法来表示对角线,真的是天马行空。

最后提交,AC😁

推导证明

首先是上下左右对角线都有特殊要求,比如该行和该列只能有自己。

其次是对角线不能有棋子,所以该方法使用两个数组和额外的表达式来表示。

最后是回溯问题,由于深度搜索的可能性较多,所以需要回溯到上一步,即没有任何干扰,俗称恢复现场。

举一反三

类似的回溯问题。

总结

继续努力,坚持更新,16th打卡。

以上是关于挑战SQL经典题(一)的主要内容,如果未能解决你的问题,请参考以下文章

寒假每日一题棋盘挑战(个人练习)详细题解+推导证明(第十六天)

接口测试项目实战与经典面试题解析,挑战 BAT 大厂必会!

挑战阿里社招百万年薪,吃透这37个经典面试题,offer能拿到手软

进互联网大厂必须要靠内推吗?挑战年薪百万程序员大咖!最经典Java面试题,看不看,你决定

宁波多校 D题 COLORS的字符串挑战(线段树+hash+二分)

极客大挑战 Hardsql