1 条题解

  • 0
    @ 2025-5-13 22:40:32

    题意分析

    1. 键盘布局:标准的 QWERTYQWERTY 键盘,每个键的左侧键是固定的。
    2. 错误类型:用户打字时手的位置整体右移一位,因此实际按下的键是目标键的右侧键。
    3. 解码规则:将输入中的每个字符替换为其左侧的键:
      • 例如 OO 的左侧键是 IISS 的左侧键是 AA,, 的左侧键是 MM
    4. 特殊处理
      • 空格保持不变。
      • 某些键(如 QQAAZZ 和反引号 `)不会出现在输入中。

    解题思路

    1. 建立映射表
      • 使用一个字符串表示 QWERTYQWERTY 键盘的每一行:
        • 第一行:"1234567890""1234567890"
        • 第二行:"QWERTYUIOP""QWERTYUIOP"
        • 第三行:"ASDFGHJKL;""ASDFGHJKL;"
        • 第四行:"ZXCVBNM,./""ZXCVBNM,./"
      • 对于每个字符(除了空格),找到它在键盘中的位置,并替换为其左侧的字符。
    2. 处理输入
      • 逐字符读取输入,如果是空格则直接输出。
      • 否则,查找该字符在键盘中的位置,并输出其左侧字符。
    3. 边界情况
      • 第一列的字符(如 11QQAAZZ)没有左侧键,但题目保证输入不会包含这些字符。

    C++ 代码实现

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    
    char str[1100];
    char g[1100] = "1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";  // 修复转义字符
    
    int main()
    {
        while (fgets(str, sizeof(str), stdin) != NULL)  // 替换不安全的gets
        {
            int len = strlen(str);
            if (len > 0 && str[len-1] == '\n')  // 移除fgets可能读取的换行符
                str[--len] = '\0';
            
            for (int i = 0; i < len; i++)
            {
                char tmp = str[i];
                if (tmp == ' ')  // 空格直接输出
                {
                    putchar(' ');
                    continue;
                }
                
                char* p = strchr(g, tmp);  // 使用更高效的查找
                if (p == NULL)
                    putchar(tmp);
                else
                    putchar(*(p-1));
            }
            putchar('\n');
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1539
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者