题目描述:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
Input:
“A B”
Output
“A%20B”
解题思路:一看是字符串处理问题,最先想到的是从前往后遍历,然后根据需求处理。这个题,如果从前往后遍历,每次遇到空格,便要将空格替换为%20,也就是说,每遇到一个空格,需要往后移动2个元素,如果字符串很长空格很多,那开销会非常大,时间复杂度也比较高。
所以这种问题可以换个思路想:既然不想每遇到一个空格都移动两个元素,那么我们可以事先计算好这个字符串有几个空格,那不就知道了 替换后的字符串总长了吗。那我们又可以从这个**“替换后的字符串总长"的最后一个元素开始往前走**,遇到空格就加个"02%"(下标从大到小),没遇到空格就让这个元素等于原来位置的字符。这其实就可以理解为 在原字符串上的“扩充”,原字符串最大长度为originLength,替换后为NewLength,那我们就将originLength长度的字符串扩充到NewLength长度的字符串,然后给NewLength长度字符串赋上结束符’\0’,就完成了字符串的空格替换。接下来是代码和演示:
void replaceSpace(char* p1, int Strlen) {
if (p1 == NULL || Strlen <= 0) {
return;
}
int BlankNum = 0;
int originLength = Strlen; //p1的长度
int i = 0;
while (p1[i] != '\0') {
if (p1[i] == ' ') {
++BlankNum; //统计空格数
}
++i;
}
int NewLength = originLength + 2 * BlankNum; //替换后p1的长度
int index_original = originLength - 1; //原始p1的初始指向(最后一个元素)
int index_new = NewLength - 1; //替换后p1的初始指向(最后一个元素)
p1[index_new + 1] = '\0'; //替换后为新的字符串赋结束符
while (index_original >= 0) { //保证原始 p1在长度范围内
//可以只有一个条件,&&index_new>index_original可以不用加
//因为新旧字符串大小都已经固定,index_new必然走在index_origin之前
if (p1[index_original] == ' ') {
p1[index_new--] = '0'; //注意顺序
p1[index_new--] = '2';
p1[index_new--] = '%';
}
else {
p1[index_new--] = p1[index_original]; //无空格
}
--index_original;
}
}
//测试
char p1[] = "leborn is a great player ";
char p2[] = "Bryant 24 ";
char p3[] = " Jordan6 rings";
char p4[] = "M A G IC";
char p5[] = "a \0 b";
char p6[] = " ";
replaceSpace(p1, strlen(p1));
cout << p1 << endl;
replaceSpace(p2, strlen(p2));
cout << p2 << endl;
replaceSpace(p3, strlen(p3));
cout << p3 << endl;
replaceSpace(p4, strlen(p4));
cout << p4 << endl;
replaceSpace(p5, strlen(p5));
cout << p5 << endl;
replaceSpace(p6, strlen(p6));
cout << p6 << endl;