查表法
2026-07-29 11:43:56
发布于:湖北
17阅读
0回复
0点赞
这道题目考察的是**数组映射(查表法)**的应用。简单来说,就是建立一个“翻译字典”,然后根据这个字典把原来的数字翻译成新的数字。
1. 题目核心逻辑
题目给了一个“密码本”,这个密码本其实就是一个对应关系表。
- 密码本的第 1 个数,告诉我们要把数字 0 变成什么。
- 密码本的第 2 个数,告诉我们要把数字 1 变成什么。
- ...
- 密码本的第 10 个数,告诉我们要把数字 9 变成什么。
关键点:这正好对应数组的下标!
如果我们定义一个数组 rule[10]:
rule[0]存储的就是 0 变成的数。rule[1]存储的就是 1 变成的数。- ...
rule[9]存储的就是 9 变成的数。
那么,对于任意一个原始数字 x,它加密后的结果就是 rule[x]。
2. 样例深度解析
让我们看看样例是怎么运作的:
输入数据:
- n = 7 (一共有7个数字要加密)
- 原始数字:
0 2 0 3 4 1 9 - 密码本:
9 0 1 2 3 4 5 6 7 8
建立密码本(映射关系):
根据密码本的顺序,我们可以列出这样的表格:
| 原始数字 (下标) | 密码本里的值 (加密结果) | 含义 |
|---|---|---|
| 0 (第1个数) | 9 | 0 变成 9 |
| 1 (第2个数) | 0 | 1 变成 0 |
| 2 (第3个数) | 1 | 2 变成 1 |
| 3 (第4个数) | 2 | 3 变成 2 |
| 4 (第5个数) | 3 | 4 变成 3 |
| ... | ... | ... |
| 9 (第10个数) | 8 | 9 变成 8 |
开始加密(查表):
我们要加密的序列是 0 2 0 3 4 1 9,我们一个个去查上面的表:
- 遇到 0 查表得 9
- 遇到 2 查表得 1
- 遇到 0 查表得 9
- 遇到 3 查表得 2
- 遇到 4 查表得 3
- 遇到 1 查表得 0
- 遇到 9 查表得 8
最终结果:9 1 9 2 3 0 8
3. 编程思路与陷阱
陷阱:输入顺序
请注意题目给出的输入顺序:
- 先输入 。
- 接着输入那 个原始数字。
- 最后才输入密码本。
这意味着,当你读到原始数字时,你还不知道密码本是什么!所以你不能边读边输出。
解决方法:你需要先用一个数组把原始数字存起来,等把密码本也读进来之后,再回头去处理原始数字。
步骤:
- 读入 。
- 定义数组
original[n],读入 个原始数字存进去。 - 定义数组
rule[10],读入 10 个密码本数字。此时rule[i]就代表数字i的加密结果。 - 遍历
original数组,对于每个数字x,输出rule[x]。
4. 参考代码 (C++)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 1. 先读入原始数字,因为后面才能读到密码本,所以要先存起来
int ori[1005]; // 假设n不会超过1000,开大一点
for (int i = 0; i < n; i++) {
cin >> ori[i];
}
// 2. 读入密码本
// rule[i] 表示数字 i 应该变成的数字
int rule[10];
for (int i = 0; i < 10; i++) {
cin >> rule[i];
}
// 3. 开始加密并输出
for (int i = 0; i < n; i++) {
int num = ori[i]; // 拿到原始数字,比如 0
int en = rule[num]; // 查表,rule[0] 就是 0 变成的数
cout << en;
// 处理空格:除了最后一个数字,后面都要加空格
if (i < n - 1) {
cout << " ";
}
}
cout << endl;
return 0;
}
总结
这道题其实就是**“数组下标即索引”**的典型应用。
- 你想把 0 变成什么,就把那个数放在数组第 0 位。
- 你想把 5 变成什么,就把那个数放在数组第 5 位。
- 最后只要用原始数字做下标,直接就能取到结果!
这里空空如也



有帮助,赞一个