题解
字母找邻居
1 条题解
-
0
P4233 字母找邻居(入门)
解题思路
字母在电脑里不是直接存的,每个字符都对应一个编号,这就是 ASCII 码。关键是:字母的编号是连续排队的——'A' 是 65,'B' 是 66,'C' 是 67……'X' 是 88;小写 'a' 是 97,'b' 是 98……
所以想让字母"往前移动"或"往后移动",只需要把它的编号加减一下。比如输入 'C'(编号 67):
- 往前 2 个:67-2 = 65,对应 'A'
- 往前 1 个:66,对应 'B'
- 往后 1 个:68,对应 'D'
- 往后 2 个:69,对应 'E'
输出顺序是"前 2 个、前 1 个、后 1 个、后 2 个",所以样例输入 C 输出 "A B D E"。
边界情况:题目保证输入范围是 C-X 或 c-x,也就是字母两边永远够得着 2 个邻居,不会出现输入 'A' 还要往前找 2 个、越出字母表的尴尬情况,放心加减即可。
注意:加出来的数字要再用 char(...) 转回字符才能输出,否则会输出数字编号而不是字母。
参考代码
// 用途:输入一个字母,输出它前面2个和后面2个字母(用ASCII码加减实现) #include <iostream> using namespace std; int main() { char c; cin >> c; // 字母在ASCII表里连续,字符加减数字就是前后移动 cout << char(c - 2) << " " << char(c - 1) << " " << char(c + 1) << " " << char(c + 2) << endl; return 0; }复杂度分析
无论输入哪个字母,都只做 4 次加减法和 4 次输出,与字母在字母表中的位置无关,时间复杂度 O(1),额外空间 O(1)。题目输入范围限定为 C-X 或 c-x,保证运算结果始终是字母,不会出界。
- 1