题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
使用语言:C++(clang++3.9)
时间限制:< 1s
空间限制:< 32M
解题思路:
题目考查重点应该是字符串的存储和指针,用面向对象来实现确实没什么意思,直接将str转成string对象处理起来相当简单,但这偏离了本意.如过纯用C来写还是有点意思的.可以采用两种思路:
一.有缓存的方法,就是建立临时数组,将字符串按顺序一个个存到数组中,遇到空格则存%20,检索完之后,再返回数组的地址.实现起来简单,但空间复杂度变高大约,相当于Copy了一边数组.时间复杂度是O(n),空间复杂度是O(2n)
二.不建立缓存,但是思路还是一样的.考虑到字符串轮讯一遍后,指针会指向最尾端,同时可以知道空格数,因此可以原地扩充存储空间大小,然后再逆序回去,利用扩充空间两个指针之间的插值位置,即可实现数据的复制.
实现思路二:
class Solution {
public:
void replaceSpace(char *str,int length) {
char* str_temp = str;
char* str_return = NULL;
int space_count = 0;
int str_len = 0;
// 先判断出空格数;
while (*str_temp != '\0') {
if (*str_temp == ' ') {
space_count++;
}
str_temp++;
str_len++;
}
//这里要算上结束符
str_temp++;
str_len++;
//这个时候,str_temp指在str的最末位,同时知道了空格的个数,我们只需要在str末尾再开辟出space_count*3的位置,就可以存下新的字符串;
str_return = str_temp + space_count * 2; // 将需返回的字符串指向最末位,接下来,实现拷贝就行了,注意此处并未开辟新的空间,而是将原来的字符串重新放在了增加空间的源地址上;
while (str_len >= 0) {
if (*str_temp == ' ') {
*str_return = '0';
*(str_return - 1) = '2';
*(str_return - 2) = '%';
str_return = str_return - 3;
str_temp--;
} else {
*str_return = *str_temp;
str_return--;
str_temp--;
}
str_len--;
}
str = str_return;
str_return = NULL;
str_temp = NULL;
}
};
实验结果:
运行时间:3ms 占用内存:504k