top1编程
← 返回题目
题解

字母找邻居

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    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