题解:洛谷 AT_abc427_a ABC - AC
【题目来源】
洛谷:AT_abc427_a [ABC427A] ABC -> AC - 洛谷
【题目描述】
给定一个只包含大写英文字母的字符串 \(S\),其中 \(S\) 的长度为奇数。
请输出将 \(S\) 的中间字符删除后得到的字符串。\(S\) 的中间字符为第 \(\frac{L+1}{2}\) 个字符,其中 \(L\) 为 \(S\) 的长度。
【输入】
从标准输入中读入一行,格式如下:
\(S\)
【输出】
输出根据题目要求处理后的字符串。
【输入样例】
ABCDE
【输出样例】
ABDE
【核心思想】
-
问题分析:给定长度为奇数 \(L\) 的字符串 \(S\),需要删除其中间字符(第 \(\frac{L+1}{2}\) 个字符),输出删除后的字符串。这是一个字符串切片/直接模拟问题,关键在于准确定位中间字符并拼接前后两部分。
-
算法选择:
- 字符串切片:将字符串分为前半部分 \([1, \frac{L}{2}]\) 和后半部分 \([\frac{L+1}{2}+1, L]\),跳过中间字符后直接拼接输出
-
关键步骤:
- 读取输入:读入字符串 \(S\),在 \(S\) 前补空格使下标从 \(1\) 开始
- 计算长度:\(n = |S|\)
- 输出前半部分:遍历 \(i\) 从 \(1\) 到 \(n/2\)(整数除法),输出 \(S[i]\)
- 输出后半部分:遍历 \(i\) 从 \((n+1)/2 + 1\) 到 \(n\),输出 \(S[i]\)
- 换行结束
-
时间/空间复杂度:
- 时间复杂度:\(O(L)\),遍历输出 \(L-1\) 个字符
- 空间复杂度:\(O(L)\),存储字符串
-
字符串切片的核心思想:
- 奇数长度对称性:中间字符位置为 \(\frac{L+1}{2}\),前半部分长度为 \(\frac{L-1}{2}\),后半部分同样,保证删除后字符串长度为 \(L-1\)(偶数)
- 下标偏移技巧:在字符串前补空格使下标从 \(1\) 开始,避免 \(0\)-based 与 \(1\)-based 的混淆
- 适用于"按位置删除/提取子串"类基础字符串操作问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h>
using namespace std;
string s; // 存储输入的字符串
int main()
{
// 输入字符串
cin >> s;
// 获取字符串长度
int n = s.size();
// 在字符串前添加空格,使索引从1开始(便于处理)
s = " " + s;
// 输出前半部分(不包括中间字符)
// 从第1个字符到第n/2个字符
for (int i = 1; i <= n / 2; i++)
{
cout << s[i];
}
// 输出后半部分(不包括中间字符)
// 从中间字符的下一个位置到字符串末尾
for (int i = (n + 1) / 2 + 1; i <= n; i++)
{
cout << s[i];
}
cout << endl;
return 0;
}
【运行结果】
ABCDE
ABDE
浙公网安备 33010602011771号