1-Description
请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.
则经过替换之后的字符串为We%20Are%20Happy.
2-Solution
下面通过两种方法解决本题,第二种方法给出详细的算法步骤,且进行了越界的判断,两种方法均在牛客网上测试通过。
1-利用新的字符串在末尾不断添加字符
class Solution {
public:
void replaceSpace(char *str,int length) {
string strtmp;//重新定义一个字符串保存替换之后的字符串
for(int i = 0; i < length; ++i){
if(str[i] == ' '){//遍历->对空格替换
strtmp += '%';
strtmp += '2';
strtmp += '0';
}else{//非空格直接保留
strtmp += str[i];
}
}
for(int j = 0; j < strtmp.length(); ++j){
str[j] = strtmp[j];//对输出赋值
}
}
};
2-先遍历,再从后往前替换
具体算法步骤如下:
1-首先通过遍历可以统计出字符串中空格的总数,并由此可以计算出替换之后字符串的总长度(每替换1个空格长度增加2,所以替换后字符串长度等于原来长度加上2乘以空格数目)
2-从后往前进行复制和替换。准备两个指针P1和P2,P1指向原始字符串的末尾,P2指向替换之后的字符串末尾(这里We Are Happy.
有2个空格,所以字符长度长度加2 * 2 = 4)
依据上述算法步骤,可以完成如下代码:
class Solution {
public:
/*注意输入参数中length为字符的总容量*/
void replaceSpace(char *str,int length) {
if(str == NULL || length < 0) return;
int origlength = 0;//字符原始长度
int numblank = 0;//空格数
int i = 0;
while(str[i] != '\0'){
++origlength;//原始长度计数
if(str[i] == ' ') ++numblank;//空格计数
++i;
}
int newlength = origlength + 2 * numblank;
if(newlength > length) return;//空间容量不够
int indexorig = origlength;//P2的位置
int indexnew = newlength;//P1的位置
while(indexorig >= 0 && indexnew > indexorig){
if(str[indexorig] == ' '){//遇到空格就在indexnew前替换,在P2位置处替换
str[indexnew--] = '0';
str[indexnew--] = '2';
str[indexnew--] = '%';//indexnew向前一共移动3次
}
else{
str[indexnew--] = str[indexorig];//没有空格则在P2位置处进行复制
}
--indexorig;//P1继续往前移
}
}
};