#P2666. 第1题-字符串替换
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 76
            Accepted: 26
            Difficulty: 2
            
          
          
          
                       所属公司 : 
                              米哈游
                                
            
                        
              时间 :2025年3月8日
                              
                      
          
 
- 
                        算法标签>模拟          
 
第1题-字符串替换
题解
题目描述
给定一个字符串,对其中的每个字符进行如下操作:
- 大写字母替换为字母表中的下一个字母(Z变为A)。
 - 小写字母替换为字母表中的前一个字母(a变为z)。
 - 数字加1(9变为0)。
 - 其他字符替换为下划线'_'。
 
思路
题目要求对字符串中的每个字符进行分类处理:大写字母替换为字母表中的下一个字母(Z变为A),小写字母替换为字母表中的前一个字母(a变为z),数字加1(9变为0),其他字符替换为下划线'_'。通过遍历字符串,对每个字符进行类型判断,并利用ASCII码和模运算实现循环逻辑,最终构建结果字符串。
- 分类处理:每个字符根据其类型(大写字母、小写字母、数字、其他)进行相应的转换。
 - 循环处理:使用模运算处理循环情况,例如大写字母Z的下一个字母是A,数字9加1后变为0。
 - 遍历字符串:对每个字符独立处理,时间复杂度为O(n),适用于大输入规模。
 
代码分析
- 字符类型判断:依次判断字符是否为大写字母、小写字母、数字,其他情况统一处理。
 - 转换逻辑:利用ASCII码和模运算进行字符转换,确保循环正确。
 - 结果构建:使用字符串或StringBuilder高效构建结果字符串。
 
问题本质
该问题考察条件判断和字符处理能力,通过模运算处理循环逻辑,确保高效处理每个字符。
C++ 代码
#include <iostream>
#include <string>
using namespace std;
int main() {
    int n;
    cin >> n;
    cin.ignore(); // 忽略换行符
    string s;
    getline(cin, s); // 读取包含空格的字符串
    
    string res;
    for (char c : s) {
        if (c >= 'A' && c <= 'Z') { // 处理大写字母
            res += (c - 'A' + 1) % 26 + 'A';
        } else if (c >= 'a' && c <= 'z') { // 处理小写字母
            res += (c - 'a' - 1 + 26) % 26 + 'a';
        } else if (c >= '0' && c <= '9') { // 处理数字
            res += (c - '0' + 1) % 10 + '0';
        } else { // 其他字符替换为下划线
            res += '_';
        }
    }
    
    cout << res << endl;
    return 0;
}
Python 代码
n = int(input())
s = input().strip()  # 读取字符串,去除首尾可能的空格(题目保证首尾无空格)
res = []
for c in s:
    if 'A' <= c <= 'Z':
        new_char = chr((ord(c) - ord('A') + 1) % 26 + ord('A'))
    elif 'a' <= c <= 'z':
        new_char = chr((ord(c) - ord('a') - 1) % 26 + ord('a'))
    elif '0' <= c <= '9':
        new_char = chr((ord(c) - ord('0') + 1) % 10 + ord('0'))
    else:
        new_char = '_'
    res.append(new_char)
print(''.join(res))
Java 代码
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine(); // 消耗换行符
        String s = sc.nextLine();
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                int offset = (c - 'A' + 1) % 26;
                sb.append((char) ('A' + offset));
            } else if (c >= 'a' && c <= 'z') {
                int offset = (c - 'a' - 1 + 26) % 26; // 防止负数
                sb.append((char) ('a' + offset));
            } else if (c >= '0' && c <= '9') {
                int num = (c - '0' + 1) % 10;
                sb.append((char) ('0' + num));
            } else {
                sb.append('_');
            }
        }
        System.out.println(sb.toString());
    }
}
        题目内容
米小游正有一个长度为 n 的字符串 s ,他将依次对每一个 i=1,2,...,n 进行以下操作:
如果 s 的第 i 个字符为大写字母,则将其替换为字母表中下一个字母(特别的,Z 替换为 A );
如果 s 的第 i 个字符为小写字母,则将其替换为字母表中上一个字母(特别的,a 替换为 z)。
如果 s 的第 i 个字符为数字,则将是替换为其加 1 (特别的,9 替换为 0);
如果 s 的第 i 个字符为其他内容,则输出一条下划线 “_” 。
输入描述
第一行输入一个整数 n(1≤n≤3×105) 代表字符串的长度。
第二行输入一个长度为 n ,且由数字、大小写字母、空格及! ? . + − ∗ / 这七个常见半角符号构成的字符串 s 代表待操作的字符串。特别的,保证字符串的首尾不为空格。
输出描述
在一行上输出一个字符串,代表操作过后的字符串。
样例1
输入
12
Ab91!?.+-*/
输出
Ba02________