题目总结与代码归档:
【剑指offer-2】题目目录【C++版本】
GitHub代码路径: GitHub
面试题5
替换空格
题目: 请实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入”We are happy.”,则输出”We%20are%20happy.”。
解题思路
空格替换成“%20”,字符串会变长。
如果能够创建新的字符串,那么题目就变得很简单,1、新分配足够的内存,用于存放变长后的字符串。2、扫描原字符串,遇到空格替换为“%20”,依次放入新分配足够的内存中
如果在原字符串上操作并且保证输入的原字符串后有足够空间,
A、从前向后: 这存在数据的重复搬移,时间复杂度高(不可取)
B、从后向前:先扫描原字符串获取空格个数,计算出新字符串(替换空格后)长度,从后向前搬移替换原字符串到新字符串(只需要搬移一次)
代码实现
# include<iostream>
using namespace std;
void replaceSpace(char str[], int length);
int main()
{
char test[15] = "We Are Happy.";
cout << "Before:"<< test << endl;
replaceSpace(test, 15);
cout << "After:" << test << endl;
system("pause");
return 0;
}
// length 为字符数组 str 的总容量
void replaceSpace(char str[], int length) {
if (str == nullptr || length <= 0) {
return;
}
int originalLength = 0; // 原始字符串的长度
int numberOfBlank = 0; // 空格的个数
int i = 0; // 扫描 原始字符串,计数空格个数 以及 原始字符串的长度, 不包括结束符
while (str[i] != '\0') {
++originalLength;
if (str[i] == ' ') {
++numberOfBlank;
}
i++;
}
/* 计算 newLength, 为把空格替换成 '%20' 之后的长度*/
int newLength = originalLength + numberOfBlank * 2; // 空格 -> %20 多了两个字符
if (newLength > length) { // 是否超出字符数组大小
cout << "Out of range" << endl;
return;
}
int indexOfOriginal = originalLength; // index 数组下标从 0 开始,这里包括结束符 所以不用-1
int indexOfNew = newLength;
while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) {
if (str[indexOfOriginal] == ' ') { // 替换空格
str[indexOfNew--] = '0';
str[indexOfNew--] = '2';
str[indexOfNew--] = '%';
}
else {
str[indexOfNew--] = str[indexOfOriginal]; // 搬移数据
}
--indexOfOriginal; // 从后向前
}
}
参考资料:
GitHub链接:
https://github.com/lichangke
优快云首页:
https://me.youkuaiyun.com/leacock1991
欢迎大家来一起交流学习