根据提供的文件信息,我们可以归纳出以下几个关键的C++知识点及相关代码示例: ### 1. 求最大公约数(GCD) ```cpp int commax(int m, int n) { int m_cup = m; int n_cup = n; int res = m_cup % n_cup; while (res != 0) { m_cup = n_cup; n_cup = res; res = m_cup % n_cup; } return n_cup; } ``` **知识点解析:** - **功能**: 该函数用于求解两个整数的最大公约数。 - **算法**: 使用辗转相除法,即欧几里得算法,这是一种非常高效的方法来计算两个正整数的最大公约数。 - **参数解释**: `m` 和 `n` 分别是输入的两个整数。 - **返回值**: 返回 `m` 和 `n` 的最大公约数。 ### 2. 字符串匹配查找子串 ```cpp char* comstr(char* lstr, char* sstr) { char* substr = (char*)malloc(256); if (strstr(lstr, sstr) != NULL) return sstr; for (int i = strlen(sstr) - 1; i > 0; i--) { for (int j = 0; j <= strlen(sstr) - i; j++) { memcpy(substr, &sstr[j], i); substr[i] = '\0'; if (strstr(lstr, substr) != NULL) return substr; } } return NULL; } ``` **知识点解析:** - **功能**: 查找字符串 `lstr` 中是否包含字符串 `sstr` 的子串,并返回最短的匹配子串。 - **实现**: 通过遍历所有可能的子串组合进行匹配。 - **参数解释**: `lstr` 是长字符串,`sstr` 是短字符串。 - **返回值**: 如果找到子串则返回匹配的子串指针,否则返回 `NULL`。 ### 3. 循环排序数组 ```cpp int main() { int a[] = {10, 6, 9, 5, 2, 8, 4, 7, 1, 3}; int len = sizeof(a) / sizeof(int); int temp; for (int i = 0; i < len;) { temp = a[a[i] - 1]; a[a[i] - 1] = a[i]; a[i] = temp; if (a[i] == i + 1) i++; } for (int j = 0; j < len; j++) cout << a[j]; return 0; } ``` **知识点解析:** - **功能**: 对数组进行循环排序。 - **算法**: 这种排序方法称为循环置换排序,其核心思想是将每个元素移动到它应该在的位置上。 - **参数解释**: 数组 `a` 包含待排序的整数。 - **返回值**: 输出排序后的数组。 ### 4. 字符串拼接 ```cpp char* strcat(char* des, char* rsc) { assert((*des != NULL) && (*rsc != NULL)); char* p = des; while (*des != '\0') des++; while (*rsc != '\0') { *des++ = *rsc++; } *des = '\0'; return p; } ``` **知识点解析:** - **功能**: 将字符串 `rsc` 拼接到字符串 `des` 的末尾。 - **实现**: 逐个字符复制直到遇到空字符 `\0`。 - **参数解释**: `des` 和 `rsc` 分别是要拼接的目标字符串和源字符串。 - **返回值**: 返回原始目标字符串 `des` 的起始地址。 ### 5. 链表操作 ```cpp Lnode* create(Lnode* head) { int n = 5; head->next = NULL; for (int i = n; i > 0; i--) { Lnode* p = new Lnode; scanf("%c", &p->data); p->next = head->next; head->next = p; } return head; } void reserve(Lnode* head) { Lnode* q = head->next; head->next = NULL; while (q) { Lnode* p = q->next; q->next = head->next; head->next = q; q = p; } } ``` **知识点解析:** - **功能**: 创建链表并反转链表。 - **创建**: 通过逐个添加节点到链表头部来构建链表。 - **反转**: 遍历原链表,将每个节点链接到新的头结点之前。 - **参数解释**: `head` 是链表的头结点。 - **返回值**: `create` 函数返回新创建的链表的头结点。 ### 6. 二叉树操作 ```cpp typedef struct node { char data; struct node* lchild, * rchild; } treenode; treenode* creat_tree(); int leafnumber = 0; int depth = 0; treenode* creat_tree() { treenode* t; char c; c = getchar(); if ('#' == c) return NULL; else { t = (treenode*)malloc(sizeof(treenode)); t->data = c; t->lchild = creat_tree(); t->rchild = creat_tree(); } return t; } void preorder(treenode* p) { if (p != NULL) { printf("%c", p->data); preorder(p->lchild); preorder(p->rchild); } } void inorder(treenode* p) { if (p != NULL) { inorder(p->lchild); printf("%c", p->data); inorder(p->rchild); } } void postorder(treenode* p) { if (p != NULL) { postorder(p->lchild); postorder(p->rchild); printf("%c", p->data); } } void countleaf(treenode* t) { if (t != NULL) { c // 此处代码缺失 } } ``` **知识点解析:** - **功能**: 构建二叉树、前序遍历、中序遍历、后序遍历以及计数叶子节点数量。 - **构建**: 通过递归的方式构建二叉树。 - **遍历**: 前序、中序和后序遍历分别按照“根左右”、“左根右”和“左右根”的顺序访问树的节点。 - **计数叶子节点**: 通过递归方式统计二叉树中叶子节点的数量。 - **参数解释**: `treenode` 定义了二叉树节点的结构;`p` 是指向树节点的指针。 - **返回值**: `creat_tree` 返回创建好的二叉树的根节点。
2025-11-13 20:18:57 9KB
1
根据给定的SQL题目及其答案,我们可以总结出一系列重要的SQL知识点和技巧,这些知识点对于学习SQL及准备面试都非常有帮助。 ### 1. 比较两个不同表中的记录 **知识点**: 子查询和连接操作是解决此类问题的关键技术。通过在两个不同的表中比较相同字段的数据来找出符合条件的记录。 **示例**: 在第一个问题中,我们通过子查询分别获取了“001”和“002”两门课程的成绩,并通过外部查询将这两组数据进行比较,找出成绩更高的学生学号。 ```sql select a.S# from (select S#, score from SC where C#='001') a, (select S#, score from SC where C#='002') b where a.score > b.score and a.S# = b.S#; ``` ### 2. 使用聚合函数与HAVING子句 **知识点**: AVG()函数用于计算平均值,GROUP BY子句用于对结果集进行分组,HAVING子句则用于过滤这些分组后的结果。 **示例**: 第二个问题展示了如何使用这些功能来找出平均成绩大于60分的学生。 ```sql select S#, avg(score) from sc group by S# having avg(score) > 60; ``` ### 3. 左连接与聚合函数结合使用 **知识点**: LEFT JOIN用于确保左侧表中的所有记录都会出现在结果集中,即使右侧表中没有匹配的记录。与聚合函数结合使用可以统计每位学生的选课数量和总成绩。 **示例**: 第三个问题中,我们使用LEFT JOIN连接学生表和成绩表,然后通过GROUP BY进行分组统计。 ```sql select Student.S#, Student.Sname, count(SC.C#), sum(score) from Student left join SC on Student.S# = SC.S# group by Student.S#, Sname ``` ### 4. 使用LIKE操作符进行模糊匹配 **知识点**: LIKE操作符允许我们在WHERE子句中使用通配符来搜索模糊匹配的字符串。 **示例**: 第四个问题中,我们利用LIKE '李%'来找出所有名字以“李”开头的老师。 ```sql select count(distinct(Tname)) from Teacher where Tname like '李%'; ``` ### 5. 使用NOT IN排除特定条件 **知识点**: NOT IN操作符可以帮助我们排除指定集合中的值,适用于查找不包含某些值的记录。 **示例**: 在第五个问题中,我们找出没有上过“叶平”老师课程的学生。 ```sql select Student.S#, Student.Sname from Student where S# not in (select distinct(SC.S#) from SC, Course, Teacher where SC.C# = Course.C# and Teacher.T# = Course.T# and Teacher.Tname = '叶平'); ``` ### 6. 存在性子查询的应用 **知识点**: EXISTS子句用于检查子查询的结果集是否为空,通常用于判断某个条件是否存在。 **示例**: 第六个问题展示了如何使用EXISTS来找出同时选修了“001”和“002”课程的学生。 ```sql select Student.S#, Student.Sname from Student, SC where Student.S# = SC.S# and SC.C# = '001' and exists (Select * from SC as SC_2 where SC_2.S# = SC.S# and SC_2.C# = '002'); ``` ### 7. 多表连接与子查询嵌套 **知识点**: 当需要从多个表中获取数据并进行复杂的逻辑判断时,可以使用多表连接配合子查询嵌套。 **示例**: 第七个问题中,我们通过多表连接以及嵌套子查询找出了学过“叶平”老师所有课程的学生。 ```sql select S#, Sname from Student where S# in (select S# from SC, Course, Teacher where SC.C# = Course.C# and Teacher.T# = Course.T# and Teacher.Tname = '叶平' group by S# having count(SC.C#) = (select count(C#) from Course, Teacher where Teacher.T# = Course.T# and Tname = '叶平')); ``` ### 8. 复杂的比较操作 **知识点**: 在某些情况下,需要在一个查询中同时比较多个条件下的记录,这通常涉及到子查询和嵌套查询的使用。 **示例**: 第八个问题中,我们使用子查询和嵌套查询来找出课程编号“002”的成绩比课程编号“001”低的所有学生。 ```sql Select S#, Sname from (select Student.S#, Student.Sname, score, (select score from SC SC_2 where SC_2.S# = Student.S# and SC_2.C# = '002') score2 from Student, SC where Student.S# = SC.S# and C# = '001') S_2 where score2 < score; ``` ### 9. 排除特定条件 **知识点**: NOT IN和NOT EXISTS是两种常用的排除特定条件的方法,它们在处理NULL值时有所不同。 **示例**: 第九个问题使用NOT IN来找出所有课程成绩小于60分的学生。 ```sql select S#, Sname from Student where S# not in (select Student.S# from Student, SC where S.S# = SC.S# and score > 60); ``` ### 10. 分组后的条件筛选 **知识点**: GROUP BY配合HAVING子句可以实现对分组后的数据进行进一步的筛选。 **示例**: 第十个问题中,我们使用GROUP BY和HAVING来找出没有学全所有课程的学生。 ```sql select Student.S#, Student.Sname from Student, SC where Student.S# = SC.S# group by Student.S#, Student.Sname having count(C#) < (select count(C#) from Course); ``` ### 11. 利用IN操作符简化查询 **知识点**: IN操作符可以用于匹配一组值中的任意一个,非常适合于简化查询语句。 **示例**: 第十一个问题中,我们使用IN操作符来找出与学号为“1001”的同学所学课程相同的其他同学。 ```sql select S#, Sname from Student, SC where Student.S# = SC.S# and C# in select C# from SC where S# = '1001'; ``` ### 12. 基于已知条件的扩展查询 **知识点**: 当已经知道某些条件时,可以通过扩展这些条件来进一步筛选数据。 **示例**: 第十二个问题中,我们基于已知的学号“001”同学的课程信息,找出所有学过他所学课程的其他同学。 ```sql select distinct SC.S#, Sname from Student, SC where Student.S# = SC.S# and C# in (select C# from SC where S# = '001'); ``` ### 13. 表更新操作 **知识点**: UPDATE语句用于修改表中的数据。通常需要指定哪些列被更新以及更新的条件是什么。 **示例**: 虽然题目只给出了前面的部分,但可以推测这里可能涉及到了对SC表进行某种更新操作。 通过以上分析,我们可以看到这些问题涵盖了SQL的基础知识到高级应用,包括连接操作、聚合函数、子查询、条件判断等多个方面。这些技能不仅对准备SQL面试非常有用,也是日常开发工作中不可或缺的能力。
2025-05-07 18:02:00 56KB sql面试题 面试题 sql
1
71道经典Android面试题和答案,重要知识点都包含了。
2024-05-25 14:29:08 54KB android
1
71道经典Android面试题和答案,重要知识点都包含了.doc
2022-07-06 14:11:46 99KB android
软件开发经典100面试题+解答.pdf,这是一份不错的文件
2022-06-10 09:04:16 2.61MB 文档
经典Java面试题集,面试题集共分为以下十部分: 一、Core Java: 1 — 95 题1 — 24 页 基础及语法: 1 — 61 题1 — 13 页 异常: 62 — 69 题13 — 15 页 集合: 70 — 80 题15 — 18 页 线程: 81 — 90 题18 — 21 页 IO & Socket: 91 — 95 题21 — 24 页 二、OOAD & UML: 96 — 101 题24 — 25 页 三、XML: 102 — 105 题26 — 29 页 四、SQL: 106 — 109 题29 — 31 页 五、JDBC & Hibernate: 110 — 121 题31 — 35 页 六、Web: 122 — 161 题35 — 44 页 七、EJB & Spring: 162 — 179 题44 — 47 页 八、数据结构& 算法& 计算机基础: 180 — 187 题47 — 51 页
2022-06-09 08:09:31 335KB Java面试题
1
MySQL数据库面试题 20个经典常用面试题_需要找工作的一定要看 共11页.pdf
2022-05-30 21:03:01 332KB 数据库 mysql 文档资料 面试
用C/C++实现的各种经典算法以及常见面试题
2021-11-21 14:44:47 9.05MB 经典算法 面试题 C C++
1
【MySQL】20个经典面试题 I 1 MySQL的复制原理以及流程 1 2 MySQL中MyISAM与InnoDB的区别,至少5点 1 2.1 MyISAM与InnoDB的5个不同点; 1 2.2 InnoDB引擎的4大特性 1 2.3 两者select count(*)哪个更快,为什么? 2 3 MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 2 3.1 varchar与char的区别 2 3.2 varchar(50)中50的涵义 2 3.3 int(20)中20的涵义 2 3.4 MySQL为什么这么设计? 2 4 问了InnoDB的事务与日志的实现方式 2 4.1 有多少种日志? 2 4.2 事物的4种隔离级别? 3 4.3 事务是如何通过日志来实现的,说得越深入越好? 3 5 MySQL binlog的几种日志录入格式以及区别? 3 5.1 Statement 4 5.1.1 优点 4 5.1.2 缺点 4 5.2 Row 4 5.2.1 优点 5 5.2.2 缺点 5 5.3 Mixedlevel: 5 6 MySQL数据库cpu飙升到500%的话怎么处理? 5 7 sql优化 6 7.1 explain出来的各种item的意义; 6 7.2 profile的意义以及使用场景; 6 8 备份计划,MySQLdump以及xtranbackup的实现原理 6 8.1 备份计划; 6 8.2 备份恢复时间; 7 8.3 xtrabackup实现原理 7 9 MySQLdump中备份出来的sql,如果我想sql文件中,一行只有一个insert....value()的话,怎么办?如果备份需要带上master的复制点信息怎么办? 7 10 500台db,在最快时间之内重启 8 11 InnoDB的读写参数优化 8 12 你是如何监控你们的数据库的?你们的慢日志都是怎么查询的? 9 13 你是否做过主从一致性校验,如果有,怎么做的,如果没有,你打算怎么做? 9 14 你们数据库是否支持emoji表情,如果不支持,如何操作? 9 15 你是如何维护数据库的数据字典的? 10 16 你们是否有开发规范,如果有,如何执行的 10 17 表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问 10 18 MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的? 10 19 如何从MySQL dump产生的全库备份中只恢复某一个库、某一张表? 11 20 开放性问题:据说是腾讯的 11
2021-08-21 14:10:37 522KB MySQL 面试题 SQL DB
都是在网上搜集的常见笔试面试题,整理不易,希望能帮到求职的小伙伴
2021-08-02 15:08:07 581KB 经典笔试面试题 offer
1