top1编程
← 返回题目
题解

判断相邻字符

1 条题解

  • 0
    @ 2026-8-4 10:11:45

    解题思路

    小写字母在计算机里其实都是用 ASCII 码存的:'a' 是 97,'b' 是 98,'c' 是 99……也就是说,相邻的两个字母,它们的 ASCII 码正好相差 1。

    比如 'e' 的编码是 101,'f' 的编码是 102,101 和 102 只差 1,所以它们是相邻字母。反过来,'a' 的编码是 97,'c' 的编码是 99,相差 2,就不是相邻字母。

    所以这道题的思路是:把两个字母相减,看差的绝对值是不是 1。因为输入的两个字母顺序可能是 "e f",也可能是 "f e",直接相减可能得到负数(比如 'e' - 'f' = -1)。为了避免负数,我们先比较两个字符的大小,用较大的 ASCII 码减去较小的 ASCII 码,得到非负的差值。

    题目要求用 if 语句实现,所以我们要写两次 if:

    • 第一次 if 求差值:如果第一个字符比第二个大,差值 = 第一个 - 第二个;否则差值 = 第二个 - 第一个;
    • 第二次 if 判断:差值等于 1,输出 YES;否则输出 NO。

    注意 char 类型的字符可以直接参与加减运算,运算时用的就是它们的 ASCII 码值。

    参考代码

    #include using namespace std;

    int main() { char a, b; // a、b 表示输入的两个小写字母 cin >> a >> b; // 读入两个字符

    int diff;        // diff 用来存放两个字母 ASCII 码的差值(保证非负)
    if (a > b) {     // 如果 a 的编码更大
        diff = a - b;    // 用大的减小的,得到正差值
    } else {
        diff = b - a;    // 否则用 b 减 a
    }
    
    if (diff == 1) {       // 差值正好是 1,说明是相邻字母
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;  // 差值不是 1,不是相邻字母
    }
    return 0;
    

    }

    复杂度分析

    程序只读入两个字符,做两次比较、一次减法和一次相等判断,运算次数固定,与字母是什么无关,时间复杂度是 O(1)。只用了两个 char 变量和一个 int 变量,空间复杂度也是 O(1)。

    • 1