#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________