要求:替换空格
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出”We%20are%20happy.”。
测试用例:
- 输入的字符串中包含空格(空格位于字符串的最前面;空格位于字符串的最后面;空格位于字符串的中间;字符串中有连续多个空格)。
- 输入的字符串不含有空格
- 特殊输入测试(字符串是一个nullptr指针;字符串是一个空字符串;字符串只有一个空格字符;字符串中有连续多个空格)。
本题考点:
- 考查对字符串的编程能力。
- 考查分析时间效率的能力。我们要能清晰地分析出两种不同方法的时间效率各是多少。
- 考查对内存覆盖是否有高度的警惕。在分析得到字符串会变长之后,我们能够意识到潜在的问题,并主动和面试官沟通以寻找问题的解决方案。
- 考查思维能力。在从前到后替换的思路被面试官否定之后,我们能迅速想到从后往前替换的方法,这是解决此题的关键。
源代码:
#include <iostream>
using namespace std;
/********************************************************************
* 参数:
* str: 字符串
* length: 为字符数组str的总容量,大于或等于字符串str的实际长度
********************************************************************/
void ReplaceBlank(char str[], int length)
{
//无效输入(空指针或者空字符)
if (nullptr == str || length <= 0)
return;
//有效输入
int i = 0;
int originalLength = 0; //字符串str的实际长度
int numberOfBlank = 0; //字符串中的空格个数
while ('\0' != str[i])
{
if (' ' == str[i])
++numberOfBlank;
++originalLength;
++i;
}
//newLength 为把空格替换成'%20'之后的长度
int newLength = originalLength + (numberOfBlank << 1);
if (length >= newLength)
{
int k = newLength;
int j = originalLength;
for (; j >= 0; --j)
{
if ( ' ' != str[j])
{
str[k--] = str[j];
}
else
{
str[k--] = '0';
str[k--] = '2';
str[k--] = '%';
}
}
}
}
参考代码:https://github.com/zhedahht/CodingInterviewChinese2/tree/master/05_ReplaceSpaces
自己代码:https://github.com/quinta2019/Offer/tree/master/05_Q_ReplaceSpaces