当前位置:网站首页>【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);
}
边栏推荐
猜你喜欢
随机推荐
How to build a quasi-real-time data warehouse?
golang刷leetcode滑动窗口(9) 颜色分类
cache2go-源码阅读
How to deal with security risks posed by machine identities
监控易火星版即将亮相:分布式运维帮助TOP3000大企业跨越管理鸿沟
深入理解IO流(第一篇)
I have 8 years of experience in the Ali test, and I was able to survive by relying on this understanding.
How to mitigate the attack of corporate account hijacking?
阿里测试8年经验,靠着这份理解,我才得以生存下来
ROS基本编程概述
golang刷leetcode 经典(2)拓扑排序
pydev debugger: warning: trying to add breakpoint to file that does not exist: /tmp/xxx
Why young people are snapping up domestic iPhone, because it is much cheaper and more populist
codeforces:E. Add Modulo 10【状态压缩 + 找规律】
MySQL主从搭建(问题大聚集,告别部署烦恼)
看【C语言】实现简易计算器教程,让小伙伴们为你竖起大拇指
2022最新彩虹表
浅谈一下pyd文件的逆向
实例034:调用函数
AtomicInteger详解