1
1
mirror of https://github.com/ParkMoonJ/KaoYan.git synced 2026-10-31 12:43:58 +08:00

Create 期中考试.md

This commit is contained in:
ParkMoonJ
2021-04-23 21:06:36 +08:00
parent 361f668e0d
commit ecd6630811

View File

@@ -0,0 +1,82 @@
### 1、字符串 `S` 的长度为 `n`,`S` 中的字符 `S[i]` 满足 `'A' <= S[i] <= 'Z'`,请设计一个时间上尽可能高效的算法,统计 `S` 中有多少个不同的字母。要求:
#### (1)给出算法的基本设计思想。
建立 `occur[26]`,初始值为 0,当字母出现时,相应位置设为 1,遍历字符串,输出 `occur` 中 1 的个数。
#### (2)根据设计思想,采用 C 或 C++ 语言描述算法,关键之处给出注释。
```cpp
int occur[26]; // 建立数组表示字母是否出现,初始为 0
int alphabet(char *S, int n) {
for (int i = 0; i < n; i++) { // 依序读入 S 中字符
occur[(int) S[i] - 65] = 1; // 字母出现时,数组相应位置变为 1('A' ~ 'Z' 的 ASCII 值为 65 ~ 90)
}
n = 0; // 初始化字母个数为 0
for (int i = 0; i < 26; i++) { // 遍历 occur 数组
n += occur[i]; // 计算有几个字母出现
}
return n;
}
```
#### (3)说明你所设计的算法的时间复杂度。
时间复杂度为 O(n)。
### 2、对于一棵非空平衡二叉树,其中任何一个节点的平衡因子只为 -1、0、1(平衡因子 = 左子树的高度 - 右子树的高度)
#### (1)请写出二叉树的结点定义(`data` 域是 `int`)。
```cpp
typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
```
#### (2)设 $a[h]$ 表示满足高为 $h$ 的平衡二叉树的最小节点数。$h = 1$ 时,只有根节点,$a[1] = 1$;$h = 2$ 时,$a[2] = 2$。请推导出 $a[h]$ 的递推关系式。
$$
a[h] = \begin{cases}
h & h = 1, 2\\
a[h - 1] + a[h - 2] + 1 & h \ge 3
\end{cases}
$$
#### (3)对于下面这颗平衡二叉树,执行如下操作:删除 98,删除 115,插入37,插入 54。请分别画出每一步插入或者删除操作完成后的平衡二叉树。
```mermaid
graph TB
subgraph 5
28 ---|L| 23
28 ---|R| 37
23 ---|L| 15
23 ---|R| 54
37 ---|R| 34
end
subgraph 4
d1(23) ---|L| d3(15)
d1 ---|R| d2
d2(37) ---|L| d5(28)
d2 ---|R| d6(34)
end
subgraph 3
c1(23) ---|L| c3(15)
c1 ---|R| c2(34)
c2 ---|L| c4(28)
end
subgraph 2
b1(34) ---|L| b2(23)
b1 ---|R| b3(115)
b2 ---|L| b4(15)
b2 ---|R| b5(28)
end
subgraph 1
a1(34) ---|L| a2(23)
a1 ---|R| a3(98)
a2 ---|L| a4(15)
a2 ---|R| a5(28)
a3 ---|R| a6(115)
end
```