题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:常规遍历方法,看到空格就替换的话,时间复杂度较高,元素移动耗费代价大。
现在先提前算好需要的空间,从尾部开始,设置两个类指针,从后向前遍历,有空格就放置,没有空格就往前走。
class Solution {
public:
void replaceSpace(char* str, int length) {
if (str == NULL && length <= 0)
return;
int originalLength = 0;
int numberOfBlank = 0;
int i = 0;
while (str[i] != '\0')
{
originalLength++;
if (str[i] == ' ')
numberOfBlank++;
i++;
} //遍历得到原始字符个数和空格个数
int newLength = originalLength + 2 * numberOfBlank; //扩容后的字符串大小
if (newLength > length)
{
return;
} //如果越界,返回
int indexOfOriginal = originalLength; //两个类指针,标记字符串
int indexOfNew = newLength;
while (indexOfOriginal < indexOfNew &&indexOfOriginal >= 0)
{
if (str[indexOfOriginal] == ' ') //发现空格,开始替换
{
str[indexOfNew--] = '0';
str[indexOfNew--] = '2';
str[indexOfNew--] = '%';
}
else
{
str[indexOfNew--] = str[indexOfOriginal];
}
indexOfOriginal--;
}
}
};
C++的简洁写法,思路是一样的。
class Solution {
public:
string replaceSpace(string s) {
int zero=0;
int indexOriginal=s.size()-1;
for(int i=0;i<s.size();i++)
{
if(s[i]==' ')
zero++;
}
s.resize(s.size()+2*zero);//扩展字符串的长度
int indexNew=s.size()-1;
while(indexOriginal>=0)
{
if(s[indexOriginal]==' ')
{
s[indexNew--]='0';
s[indexNew--]='2';
s[indexNew--]='%';
}
else
{
s[indexNew--]=s[indexOriginal];
}
indexOriginal--;//往前遍历
}
return s;
}
};
如果熟悉字符串的特性,直接遍历,遇到空格,字符串累加也可以。