【题解】剑指 Offer 05. 替换空格 (C 语言)
⭐️题目概要⭐️
请实现一个函数,把字符串s
中的每个空格替换成"%20
"。
📒博客主页:https://www.infoq.cn/profile/D47E9FD34A2AE2/publish
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创!
📆InfoQ 首发时间:🌴2022 年 6 月 14 日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《数据结构与算法》
💬参考在线编程网站:🌐牛客网🌐力扣
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
⭐️剑指 Offer 05. 替换空格⭐️
请实现一个函数,把字符串
s
中的每个空格替换成"%20
"。
示例:
限制:
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/
⭐️解题思路⭐️
在网络编程中,如果
URL
参数中含有特殊字符,如空格
、#
等,则可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在%
后面跟上ASCII
码的两位十六进制的表示。比如空格
的ASCII
码是32
,即十六进制的0x20
,因此空格被替换成"%20
"。再比如#
的ASCII
码为35
,即十六进制的0x23
,它在URL
中被替换为"%23
"。
看到这个题目,我们首先应该想到的是原来一个空格字符,替换之后变成'%'、'2'和'0'
这 3 个字符,因此字符串会变长。如果是在原来的字符串上进行替换,就有可能覆盖修改在该字符串后面的内存。如果是创建新的字符串并在新的字符串上进行替换,那么我们可以自己分配足够多的内存。由于在力扣在线平台上 C 语言提供的是一个常量的字符串,不能再原地进行修改,所以本文采用创建新的字符串变量并在上面进行替换。
要创建一个新的字符串变量,就考虑申请多少的空间,假设输入的字符串长度为len
,你可以不经思考地申请一块3*len + 1
大小的空间,因为当这个字符串全部是空格时替换后的长度就变为了3*len
,考虑到还有一个\0
,所以替换后的字符串长度最大为3*len+1
(包括\0
)。但是对于新空间的开辟,坚持“用多少开多少的原则”,我们可以先遍历一遍原字符串,计算出空格字符的数量cnt
,原来是一个字符替换后变为三个字符,相当于增加了俩个字符,再加上最后的\0
,所以需要给替换后的新字符串长度开辟的空间为len + cnt*2 + 1
。
开辟好足够的空间后,就是字符串的替换了。
对于这道题,博主给出 3 种解题方法:
方法 1: 先将输入的字符串拷贝,然后在拷贝的字符串变量上进行替换修改。对该字符串进行遍历,遇到空格将空格后的所有字符向后移动两位,然后将空格替换为%20
。
时间复杂度: O(N^2^)
方法 2: 先将输入的字符串拷贝,然后在拷贝的字符串变量上进行替换修改。与方法 1 不同的是这次准备两个指针,一个指向原来字符串\0
的位置记为left
,另一个指向新申请字符串变量中将空格替换后\0
的位置记为right
。(<font color=red>这就表示新申请的空间要刚刚合适或者需要计算空格数量得到新的\0
的位置</font>)然后将left
指向的字符移动到right
所指向的空间,从后往前遍历,当left
遇到空格时将right
向前移动 3 次,插入%20
。直到left = right
。当两个指针相等时,表示字符串替换完毕。
时间复杂度: O(N)
方法 3: 边进行字符串拷贝边进行空格替换。对新旧两个字符串同时进行遍历,如果原来的字符串遇到空格,就在新字符串后插入%20
。
时间复杂度: O(N)
源代码
编程语言:C 语言在线编程平台:力扣
版权声明: 本文为 InfoQ 作者【未见花闻】的原创文章。
原文链接:【http://xie.infoq.cn/article/c42ca478551dad9b0dcfe735d】。文章转载请联系作者。
评论