笔试总结:数据库、Linux、并发、Python、算法与网络知识回顾

4 阅读10分钟

笔试总结:数据库、Linux、并发、Python、算法与网络知识回顾

最近参加了一场技术笔试,内容涵盖数据库、Linux命令、并发编程、Python基础与进阶、算法与数据结构、计算机网络等多个方向。整体难度适中,但考察点非常细致,尤其对基础原理的理解要求较高。以下是我对本次笔试题目的梳理与总结,希望对正在准备技术笔试的同学有所帮助。


一、数据库与SQL

题目1:统计器材类型的租赁次数

题目描述
某摄影器材租赁平台有如下数据库表结构:

  • Equipments:equipment_id(器材编号)、type(器材类型)、brand(品牌)
  • Rentals:rental_id(租赁记录编号)、equipment_id(器材编号)、rental_date(租赁日期)

要求统计每种器材类型的租赁次数,正确的 SQL 语句是()

  • A. SELECT type, COUNT(*) FROM Rentals GROUP BY type;
  • B. SELECT type, COUNT(rental_id) FROM Equipments JOIN Rentals ON Equipments.equipment_id = Rentals.equipment_id GROUP BY type;
  • C. SELECT brand, COUNT(rental_id) FROM Equipments JOIN Rentals ON Equipments.equipment_id = Rentals.equipment_id GROUP BY brand;
  • D. SELECT type, COUNT(DISTINCT equipment_id) FROM Equipments JOIN Rentals ON Equipments.equipment_id = Rentals.equipment_id GROUP BY type;

正确答案:B
解析:需要将 Equipments 与 Rentals 表连接,按器材类型分组,统计租赁记录数量。直接对 Rentals 表分组无法获取器材类型。


题目2:InnoDB 聚簇索引

题目描述
在 MySQL InnoDB 存储引擎中,下列关于聚簇索引(Clustered Index)的描述错误的是()

  • A. 表的主键索引通常是聚簇索引
  • B. 聚簇索引的叶子节点存储了完整的数据行而非指针
  • C. 一个 InnoDB 表可以同时拥有多个聚簇索引以提高不同查询的性能
  • D. 如果表没有定义主键,InnoDB 会选择一个唯一非空索引作为聚簇索引

正确答案:C
解析:InnoDB 表中只能有一个聚簇索引(通常为主键),选项 C 声称可以有多个是错误的。


题目3:InnoDB 行锁机制

题目描述
在 MySQL InnoDB 引擎中,下列关于行锁(Row Lock)的描述正确的是()

  • A. 行锁总是锁定物理行而不是索引记录,因此不依赖于索引的存在
  • B. 行锁是基于索引实现的,如果查询未使用索引可能导致锁定过多数据
  • C. InnoDB 的行锁在事务提交前会自动降级为意向锁以提高并发性
  • D. 使用非索引列作为 WHERE 条件时 InnoDB 会自动升级为表锁以保证数据一致性

正确答案:B
解析:InnoDB 的行锁是基于索引实现的,若查询未使用索引,可能会锁住大量数据,甚至退化为表锁。


二、Linux 命令与系统

题目1:文件权限修改

题目描述
Linux 中有一个文件image.png,其权限标识为:-r--r--r--,现要将其权限值修改为644,则下面命令不能实现的是()

  • A. chmod u=rw,g=r,o=r image.png
  • B. chmod 644 image.png
  • C. chmod u+w,g+w,o=r image.png
  • D. chmod u+w,a-x image.png

正确答案:C
解析:原权限为 -r--r--r--(444),目标为 644。选项 C 添加了组写权限,结果为 664,不符合要求。


题目2:筛选 CSV 中年龄大于 28 的行

题目描述
Linux 中有文件users.csv,其内容如下:

text

id,name,age,city
1,Alice,30,NewYork
2,Bob,25,Boston
3,Charlie,35,Chicago
4,David,28,Denver
5,Eve,22,NewYork
6,Tom,29,Beijing

需要筛选出age大于 28 的行,以下哪个命令可以实现()

  • A. awk -F, '$3 > 28' users.csv
  • B. cut -d, -f3 users.csv | grep '^[3-9]'
  • C. grep ',[3-9][0-9],' users.csv
  • D. sed -n '/,[3-9][0-9],/p' users.csv

正确答案:A
解析awk -F, '$3 > 28' 是最直接准确的方式,其他选项如 grep 或 sed 难以精确匹配数值。


三、并发与线程

题目1:无同步的线程并发

题目描述
两个线程并发执行以下代码:

c

int count = 3;
void decrement() {
    count--;
}

若未同步,最终count的可能最大值是()

  • A. 3
  • B. 1
  • C. 2
  • D. 0

正确答案:C(2)
解析:两个线程同时执行 count--,若都读到了初始值 3,则最终结果可能为 2,体现了线程不安全的风险。


题目2:线程私有资源

题目描述
某银行后台系统的开发团队发现,当多个客户端并发发起交易请求时,偶尔会出现账户余额计算混乱的故障。经排查发现,这是由于线程间意外篡改了某类本应隔离的资源所致。下列哪种资源在正确实现时应由线程独立持有以防止此类问题?()

  • A. 共享文件句柄
  • B. 动态分配的堆内存
  • C. 线程栈(Stack)
  • D. 全局配置参数表

正确答案:C(线程栈)
解析:栈是线程私有的,堆、全局变量、文件句柄等是共享资源,需加锁保护。


四、Python 基础与进阶

题目1:字符串操作

题目描述
代码:text = "Welcome to the world of Python programming."
考虑下列说法中哪些是正确的()

  • A. 使用text.find('Python')可以返回 "Python" 在文本中的起始位置
  • B. 使用text.strip('W')可以删除文本中以 "W" 开头的单词
  • C. 使用text.split('o')可以将文本按字母 "o" 分割成列表
  • D. 使用text.lower()可以将文本转换为小写

正确答案:ACD
解析

  • A:find() 返回子串位置 ✔
  • B:strip('W') 只能删除首尾字符,不能删除单词 ✘
  • C:split('o') 按 o 分割 ✔
  • D:lower() 转小写 ✔

题目2:控制流程

题目描述
关于 Python 控制流程的基本使用,以下说法正确的是()

  • A. if-elif-else语句用于根据不同的条件执行不同的代码块,elif和else语句是可选的
  • B. for循环只能用于遍历列表,不能用于遍历其他数据类型,例如字典和集合
  • C. while循环会一直执行,直到条件为False,可以使用break语句提前退出循环,使用continue语句跳过当前循环
  • D. 迭代器是一种对象,只能使用next()方法逐个访问元素,不能使用for循环遍历

正确答案:AC
解析

  • B:for 可遍历字典、集合等 ✘
  • D:迭代器可用 for 遍历 ✘

题目3:面向对象特性

题目描述
对于 Python 面向对象编程的高级特性和应用场景,以下理解正确的是()

  • A. 私有属性和私有方法是通过在属性名或方法名前加两个下划线(__)来实现的,它们只能在类的内部访问,外部无法直接访问
  • B. 类方法和静态方法是两种特殊的方法,类方法使用@classmethod装饰器定义,它的第一个参数是类本身(通常命名为cls);静态方法使用@staticmethod装饰器定义,它不需要传递类或对象作为参数
  • C. 当使用多继承时,Python 会按照一定的顺序(如 MRO - 方法解析顺序)来查找方法,可能会导致一些复杂的问题,需要谨慎使用
  • D. 面向对象编程在所有场景下都比面向过程编程更优,应该尽量使用面向对象编程来解决问题

正确答案:ABC
解析

  • D:OOP 并非适用所有场景 ✘

题目4:数据结构性能

题目描述
当涉及到 Python 列表、字典和集合的性能和应用场景时,以下判断正确的是()

  • A. 在查找元素方面,集合的查找效率比列表高得多,因为集合是基于哈希表实现的,而列表需要遍历元素
  • B. 对于需要频繁添加和删除元素的场景,列表比集合更适合,因为列表的操作更灵活
  • C. 当需要对元素进行排序时,集合和字典都可以直接使用sort()方法进行排序
  • D. 字典在存储和查找键值对时非常高效,适合用于需要根据键快速查找值的场景,例如存储用户信息

正确答案:AD
解析

  • B:增删频繁,集合/链表更优 ✘
  • C:集合无 sort() 方法 ✘

题目5:字典操作

题目描述
在 Python3 中,对于字典d = {'a': 1, 'b': 2, 'c': 3},下列选项中执行后字典d发生变化的是()

  • A. d.update({'d': 4})
  • B. d.pop('b')
  • C. d.keys()
  • D. d.get('a')

正确答案:AB
解析

  • update() 和 pop() 会修改原字典
  • keys() 和 get() 不会修改原字典

五、算法与数据结构

题目1:二叉树与堆

题目描述
已知一棵二叉树的中序遍历为50,18,35,5,90,70,110,具体形态满足小根堆性质。若将该二叉树看作小根堆,调整为大根堆需交换()次。

  • A. 4
  • B. 5
  • C. 2
  • D. 3

正确答案:D(3次交换)
解析:给定中序遍历序列,需还原堆结构并进行调整,交换次数为 3。


题目2:KMP 算法

题目描述
在文本编辑器中,用户想查找特定的字符串。已知文档内容 S='aaacbaacbcabbbbcacacb',搜索字符串 t='aaacbc'。采用 KMP 算法进行匹配,当第一次出现"失配"时,位置为 i = j = 5。请问下次开始匹配时,i 和 j 的值分别是()。

  • A. i=5, j=0
  • B. i=10, j=0
  • C. i=5, j=2
  • D. i=6, j=1

正确答案:C(i=5, j=2)
解析:KMP 失配时主串指针不回退,模式串指针根据 next 数组调整。


题目3:构造最大数

题目描述
给定 k 个空位,需用 0-9 的数字填充,使得所有空位的数字之和为 S,求最大数。现有以下代码段需补全:

c

void solve() {
    for(int i = 0; i < k; i++) {
        if(S > 9) {
            ______;
        } else {
            a[i] = S;
            S = 0;
        }
    }
}

应补全的代码是()

  • A. a[i] = 1; S--;
  • B. a[i] = 9; S -= 9;
  • C. a[i] = S; S = 0;
  • D. a[i] = 0; S = S;

正确答案:B
解析:在位数固定、数字和固定的情况下,尽量在高位放 9 可获得最大数。


题目4:找零最少张数

题目描述
在地铁充值站,工作人员需要找零给顾客 68 元。充值站有面值为 50 元、20 元、1 元、100 元和 10 元的充值卡,每种充值卡数量充足。请计算至少需要多少张充值卡来找零。()

  • A. 11
  • B. 9
  • C. 8
  • D. 10

正确答案:6(贪心策略)
解析:68 元可用 50 + 10 + 5 + 1 + 1 + 1 共 6 张,选项可能设置不合理,需灵活判断。


六、计算机网络

题目1:HTTP/2 多路复用

题目描述
HTTP/2 的多路复用(Multiplexing)机制的主要优点是什么()

  • A. 支持多个请求和响应在同一连接上并行传输
  • B. 减少 UDP 连接的建立和关闭开销
  • C. 减少 HTTP 头部的大小
  • D. 提高数据传输的安全性

正确答案:A
解析:多路复用允许在同一个 TCP 连接上并行处理多个请求和响应,显著提升性能。


总结

本次笔试考察范围广,难度适中,重点在于对基础知识的理解深度与实际应用能力。尤其是以下几个方面值得重点复习:

  • SQL 的多表连接与分组统计
  • InnoDB 索引与锁机制
  • Linux 文本处理命令(如 awk
  • Python 常见数据结构与方法的使用细节
  • 算法中的贪心策略与 KMP 匹配
  • 网络协议中的性能优化机制