北邮OJ - 字符串翻转/替换操作 完整笔记
一、题目核心信息
1. 题目要求
- 输入:多组数据(每组含1个字符串 + n条命令)
- 命令类型:
- 0(翻转):对字符串[start, start+len-1]区间字符倒序
- 1(替换):用命令第4位开始的字符串,替换原字符串[start, start+len-1]区间(支持替换内容与原区间长度不等)
- 输出:每条命令执行后输出最新字符串
- 限制:原字符串长度≤100,指令均有效
2. 输入输出样例解析
| 输入 | 操作逻辑 | 输出 |
|---|
| bac | 初始字符串 | - |
| 2 | 2条命令 | - |
| 003 | 翻转:start=0,len=3 → bac → cab | cab |
| 112as | 替换:start=1,len=2 → cab中ab替换为as → cas | cas |
二、核心代码逻辑拆解
1. 翻转操作(双指针法)
int left = start;
int right = start + len - 1;
while (left < right) {
char temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
- 核心逻辑:原地交换,无需额外空间,时间复杂度O(len)
- 关键:
right = start + len - 1 精准定位操作区间的最后一位
2. 替换操作(支持长度不等,三段拼接法)
char *replace_str = cmd + 3;
int replace_len = strlen(replace_str);
char temp[201];
strncpy(temp, str, start);
strcpy(temp + start, replace_str);
strcpy(temp + start + replace_len, str + start + len);
strcpy(str, temp);
关键表达式解析(易错点)
| 表达式 | 含义 |
|---|
cmd + 3 | 指针偏移,指向命令字符串第4位(替换内容起始位置),等价于&cmd[3] |
temp + start | 临时数组中拼接替换内容的起始位置 |
temp + start + replace_len | 临时数组中拼接原字符串后半段的起始位置(由替换内容长度决定) |
str + start + len | 原字符串中操作区间后的起始位置(由原操作长度决定,与替换内容无关) |
三、核心函数用法总结
| 函数 | 代码中的作用 | 关键注意事项 |
|---|
strncpy | strncpy(temp, str, start) | 复制原字符串前start个字符,不自动补\0(本题后续拼接覆盖,无需手动补) |
strcpy | strcpy(temp+start, replace_str) | 完整复制替换内容(含\0),覆盖临时数组指定位置 |
strcpy | strcpy(temp+start+replace_len, ...) | 从替换内容末尾开始,拼接原字符串未操作的后半段 |
strlen | strlen(replace_str) | 计算替换内容的有效长度(不含\0) |
四、代码优化与避坑点
1. 数组长度设计
- 定义
char str[201]/char temp[201]:原字符串≤100,预留翻倍空间避免替换后长度超出导致溢出 - 若仅定义101长度,替换内容更长时会出现内存越界,导致程序崩溃
2. 多组输入处理
- 用
while (scanf("%s", str) != EOF)循环读取多组数据,适配题目“输入有多组数据”的要求
3. 字符转整数
- 命令解析:
op = cmd[0]-'0'、start=cmd[1]-'0'、len=cmd[2]-'0' - 原理:字符’0’-'9’的ASCII码连续,减’0’可转为对应整数
五、核心考点与解题思路
| 考点 | 解题思路 |
|---|
| 字符串翻转 | 双指针法(原地交换,高效) |
| 不等长字符串替换 | 三段拼接(前半段+替换内容+后半段) |
| 指针偏移操作 | 利用数组名+偏移量定位字符串位置 |
| 多组输入处理 | EOF循环读取 |
六、样例执行完整流程
- 初始字符串:
bac - 第一条命令
003(翻转):
- start=0,len=3 → left=0,right=2
- 交换b和c →
cac → 交换a(中间位无需交换)→ 最终cab,输出cab
- 第二条命令
112as(替换):
- op=1,start=1,len=2 → 替换内容
as(replace_len=2) - 步骤1:
strncpy(temp, "cab", 1) → temp[0]=‘c’ - 步骤2:
strcpy(temp+1, "as") → temp=“cas” - 步骤3:
strcpy(temp+1+2, "cab"+1+2) → 拼接空字符 - 步骤4:
strcpy(str, temp) → str=“cas”,输出cas
七、总结
- 翻转操作核心是双指针向中间交换,精准控制操作区间的左右边界;
- 替换操作的关键是“三段拼接”,读取原字符串的位置由
start+len决定,写入新字符串的位置由start+replace_len决定; - 数组长度需预留足够空间,避免替换后字符串变长导致溢出;
- 命令解析时注意字符转整数(减’0’),指针偏移是提取替换内容的核心技巧。
所有评论(0)