北邮OJ - 字符串翻转/替换操作 完整笔记

一、题目核心信息

1. 题目要求

  • 输入:多组数据(每组含1个字符串 + n条命令)
  • 命令类型:
    • 0(翻转):对字符串[start, start+len-1]区间字符倒序
    • 1(替换):用命令第4位开始的字符串,替换原字符串[start, start+len-1]区间(支持替换内容与原区间长度不等)
  • 输出:每条命令执行后输出最新字符串
  • 限制:原字符串长度≤100,指令均有效

2. 输入输出样例解析

输入操作逻辑输出
bac初始字符串-
22条命令-
003翻转:start=0,len=3 → bac → cabcab
112as替换:start=1,len=2 → cab中ab替换为as → cascas

二、核心代码逻辑拆解

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;          // 提取命令中替换内容(第4位开始)
int replace_len = strlen(replace_str);// 获取替换内容长度
char temp[201];                       // 临时数组(预留足够空间)

// 步骤1:复制原字符串[0, start-1]的内容
strncpy(temp, str, start);
// 步骤2:从start位置拼接替换内容
strcpy(temp + start, replace_str);
// 步骤3:拼接原字符串[start+len, 末尾]的内容(原操作区间后的部分)
strcpy(temp + start + replace_len, str + start + len);
// 步骤4:覆盖原字符串,完成替换
strcpy(str, temp);
关键表达式解析(易错点)
表达式含义
cmd + 3指针偏移,指向命令字符串第4位(替换内容起始位置),等价于&cmd[3]
temp + start临时数组中拼接替换内容的起始位置
temp + start + replace_len临时数组中拼接原字符串后半段的起始位置(由替换内容长度决定)
str + start + len原字符串中操作区间后的起始位置(由原操作长度决定,与替换内容无关)

三、核心函数用法总结

函数代码中的作用关键注意事项
strncpystrncpy(temp, str, start)复制原字符串前start个字符,不自动补\0(本题后续拼接覆盖,无需手动补)
strcpystrcpy(temp+start, replace_str)完整复制替换内容(含\0),覆盖临时数组指定位置
strcpystrcpy(temp+start+replace_len, ...)从替换内容末尾开始,拼接原字符串未操作的后半段
strlenstrlen(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循环读取

六、样例执行完整流程

  1. 初始字符串:bac
  2. 第一条命令003(翻转):
    • start=0,len=3 → left=0,right=2
    • 交换b和c → cac → 交换a(中间位无需交换)→ 最终cab,输出cab
  3. 第二条命令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

七、总结

  1. 翻转操作核心是双指针向中间交换,精准控制操作区间的左右边界;
  2. 替换操作的关键是“三段拼接”,读取原字符串的位置由start+len决定,写入新字符串的位置由start+replace_len决定;
  3. 数组长度需预留足够空间,避免替换后字符串变长导致溢出;
  4. 命令解析时注意字符转整数(减’0’),指针偏移是提取替换内容的核心技巧。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐