当前位置:网站首页>【C语言刷题】牛客网刷题——替换空格
【C语言刷题】牛客网刷题——替换空格
2022-08-02 18:32:00 【桦秋静】
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
核心代码模式:
void replaceSpace(char *str,int length)
{
}
题目这里就是要我们直接修改str指向字符串,按照要求把每一个空格替换成"%20",length就是所给字符串长度。
思路分析和代码实现(C语言)
1.双指针移位法
我们不创建新的数组,直接对str指向字符串”原地修改“。我们假定要在原字符串基础上增长一段,定义两个指针,end1指向当前字符串末尾处,end2指向增长后的字符串的末尾处,那么要增长多少呢?你想啊,题目说了每个空格要替换成"%20",也就是由原来的一个字符变成了三个字符,于是每换一次字符串就要增长2个字节,有几个空格就换几次嘛,所以最终要增长2空格数。关于空格数如何得到其实很简单,遍历字符串遇到空格计数即可。
下面就以题目给的例子"We Are Happy.“来讲解。
接下来就让两指针向前移动,如果end1没有遇到空格的话,就把end1指向的字符拷贝到end2指向的位置,要是end1遇到空格了,就让end2的指向从当前位置开始向前分别放入字符’0’、‘2’和’%'。由于需要重复这些过程,我们很容易知道需要套上一个循环,那么循环条件是什么呢?
在两指针向前移动过程中,每轮循环end1都固定地-1,而end2则不同,如果end1没遇到空格,end2同end1一样每轮向前移动一位;要是end1遇到空格,此时end2向前移动了三位(因为要放入”%20"),也就比end1多向前移动了两位,所以总共要多向前移动2空格数位,而一开始end1就比end2靠前2*空格数位,这就是说,最终两个指针会相遇,当它们相遇时说明移位结束,字符串修改完成。所以循环的条件就是end1 != end2
。
欸,end1和end2相同时"We"就没有移位呀,是不是有问题啊?别急,你仔细看图,这个时候"We"也就是第一个单词已经不需要再移位了!
代码实现
void replaceSpace(char* str, int length)
{
int space_cnt = 0;
char* tmp = str;
while (*tmp)
{
if (*tmp == ' ')
space_cnt++;
tmp++;
}
char* end1 = str + length - 1;
char* end2 = end1 + 2 * space_cnt;
while (end1 != end2)
{
if (*end1 != ' ')
{
*end2-- = *end1--;
}
else
{
end1--;
*end2-- = '0';
*end2-- = '2';
*end2-- = '%';
}
}
}
2.辅助数组遍历拷贝
考虑新建一个辅助数组,比原数组要大,我们这里直接莽个两倍,动态开辟内存。遍历原数组,如果没遇到空格的话就把字符原封不动拷贝到辅助数组中,如果遇到空格的话就把"%20"按顺序放入辅助数组中,辅助数组下标得+3,毕竟一次放了三个字符。等遍历完以后,要记得给辅助数组在最后加个’\0’。
最后把辅助数组拷贝到原数组中即可。
代码实现
void replaceSpace(char* s, int len)
{
int cnt = 0;
char* ret = (char*)calloc(2 * len, sizeof(char));
char* ptr = s;
while (*ptr)
{
if (*ptr != ' ')
{
ret[cnt] = *ptr;
cnt++;
}
else
{
ret[cnt] = '%';
ret[cnt + 1] = '2';
ret[cnt + 2] = '0';
cnt += 3;
}
ptr++;
}
ret[cnt] = '\0';
strcpy(s, ret);
}
边栏推荐
猜你喜欢
Monitor is easy to Mars debut: distributed operations help TOP3000 across management gap
Mppt光伏最大功率点跟踪控制matlab仿真
千万级QPS下服务如何才能平滑启动
T5: Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
从技术全景到场景实战,透析「窄带高清」的演进突破
Interviewer: can you talk about optimistic locking and pessimistic locks
From the technical panorama to the actual scene, analyze the evolutionary breakthrough of "narrowband high-definition"
有什么好用的IT资产管理软件
VSTO踩坑记录(1)- 从零开始开发outlook插件
中国科学院院属研究单位
随机推荐
POE交换机常见问题解答
NIO之Selector执行流程
论文阅读_胶囊网络CapsNet
如何应对机器身份带来的安全风险
二本 两年经验读者 阿里P6面经
中断向量表概述
洛谷P2880 Balanced Lineup G
实例033:列表转字符串
[Dynamic Programming Special Training] Basics
T31开发笔记:metaipc测试
MySQL LIKE – 语法和用法示例教程
My recursive never burst stack
被审稿人吐槽没有novelty!深度学习方向怎么找创新点?
LeetCode 2349. 设计数字容器系统(SortedSet)
Open Source Summer | [Cloud Native] DevOps (5): Integrating Harbor
阿里测试8年经验,靠着这份理解,我才得以生存下来
指针常量和常量指针概述
针对时间的功能测试点,这里给你总结全面了
情景剧《重走长征路》上演
POE交换机全方位解读(中)