Files
hello-algo/docs/chapter_data_structure/exercises.md
T
2026-07-19 07:19:42 +08:00

87 lines
4.0 KiB
Markdown

# 练习
## 知识巩固
### 生活场景中的数据关系
请根据数据之间的关系,为下面三个场景选择“线性结构、树形结构、网状结构”中的一种,并说明理由:
<!-- numbered-subquestions -->
1. 同学们排成一列,每人只关心自己前面和后面的人;
2. 学校按“学校 → 年级 → 班级”分层管理;
3. 城市道路连接多个路口,一个路口可以通向多个其他路口,也可能形成环路。
??? success "参考答案"
1. 是线性结构。除排在最前和最后的人外,每个人都只与前面和后面各一人相邻,关系沿一条线展开。
2. 是树形结构。每个班级属于一个年级,每个年级又属于学校,关系从上到下分层展开。
3. 是网状结构。一个路口可以连接多个路口,路线之间还能形成环,不能排成单一顺序或严格层级。
判断结构时应先观察元素之间的关系,而不是先考虑它在内存中占多少空间。
### 逻辑顺序怎样存进内存
为了保存逻辑顺序 `A → B → C`,现有两种简化的内存安排:
- 方案甲:`A、B、C` 分别放在编号为 `20、21、22` 的内存格中;
- 方案乙:`A、B、C` 分别放在编号为 `20、7、31` 的内存格中,并由 `A` 记录 `B` 的位置、`B` 记录 `C` 的位置。
<!-- numbered-subquestions -->
1. 哪个方案属于连续空间存储?哪个属于分散空间存储?
2. 两个方案分别更接近数组还是链表?
3. 方案乙的内存格编号没有按大小排列,为什么仍能表示 `A → B → C` 的逻辑顺序?
??? success "参考答案"
1. 方案甲使用连续的内存格,属于连续空间存储;方案乙的节点分散在不同位置,属于分散空间存储。
2. 方案甲更接近数组,方案乙更接近链表。
3. 逻辑顺序由节点之间记录的连接关系决定,而不是由内存格编号的大小决定。
`A` 记录的位置可以找到 `B`,再从 `B` 记录的位置找到 `C`,所以仍能依次访问 `A、B、C`
这也说明逻辑结构和物理结构是观察同一组数据的两个不同角度。
### 作业记录中的数据类型与结构
某学习小组按座位顺序记录 4 名同学是否交了作业,得到:
`[true, false, true, true]`
<!-- numbered-subquestions -->
1. 每个元素适合使用哪种基本数据类型?
2. 这 4 个元素按座位顺序排成一列,使用了什么逻辑结构?
3. 如果以后改为记录每人的作业分数 `[90, 0, 85, 100]`,改变的是数据的“内容类型”还是“组织方式”?说明理由。
??? success "参考答案"
1. 每个元素只表示“是”或“否”,适合使用布尔类型 `bool`
2. 这些元素按座位顺序排列,形成线性结构,可以用数组保存。
3. 改变的是内容类型:元素由布尔值变成了整数。组织方式没有改变,
这些数据仍然按座位顺序排成一列,仍可使用数组这一线性结构。
基本数据类型描述“存的是什么”,数据结构描述“数据怎样组织”。
## 编程练习
### 统计二进制表示中的 1
给定非负整数 `n`,请统计它的二进制表示中共有多少个 1。
要求使用位运算完成,不把二进制表示转换成字符串,也不使用直接统计 1 的内置函数。
??? tip "解题提示"
1. n & 1 可以取出 n 的最右边一位,用它判断这一位是否为 1
2. 右移一位表示丢掉当前最右边的二进制位;多数语言使用运算符 >>
3. 完成逐位检查并右移的方法后,再观察:n & (n - 1) 会把 n 中最右边的一个 1 变成 0
[LeetCode](https://leetcode.cn/problems/number-of-1-bits/){ .rounded-button .exercise-button target="_blank" rel="noopener noreferrer" } [题目解析](https://leetcode.cn/problems/number-of-1-bits/solutions/2361978/191-wei-1-de-ge-shu-wei-yun-suan-qing-xi-40rw/){ .rounded-button .exercise-button target="_blank" rel="noopener noreferrer" }