替换空格
程序员文章站
2022-07-15 16:16:01
...
问题描述
将一个字符串中的空格替换成 “%20”。
Input:
"We Are Happy"
Output:
"We%20Are%20Happy"
解题思路
- 在原字符串地址空间进行操作,length(新)>length(旧),来节省空间
- 利用char*字符串的==’\0’==来完成遍历,求取新字符串长度
- 令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。
从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。
代码
main()中用到了char* 内存空间的分配问题
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 思路
//1:从前往后插入,这样移动·的次数多不建议
//2:从后往前插入
class Solution {
public:
void repalceSapce(char *str, int length)
{
//遍历一边字符串找出空格的数量
if (str == NULL || length < 0)
return;
int i = 0;
int oldnumber = 0;//记录以前的长度
int replacenumber = 0;//记录空格的数量
while (str[i] != '\0')
{
oldnumber++;
if (str[i] == ' ')
{
replacenumber++;
}
i++;
}
int newlength = oldnumber + replacenumber * 2;//插入后的长度
if (newlength > length)//如果计算后的长度大于总长度就无法插入
return;
int pOldlength = oldnumber; //注意不要减一因为隐藏个‘\0’也要算里
int pNewlength = newlength;
while (pOldlength >= 0 && pNewlength > pOldlength)//放字符
{
if (str[pOldlength] == ' ') //碰到空格就替换
{
str[pNewlength--] = '0';
str[pNewlength--] = '2';
str[pNewlength--] = '%';
}
else //不是空格就把pOldlength指向的字符装入pNewlength指向的位置
{
str[pNewlength--] = str[pOldlength];
}
pOldlength--; //不管是if还是elsr都要把pOldlength前移
}
}
};
int main()
{
Solution sol;
string strTmp = "We are happy";
char* str = new char[24];
strcpy_s(str, 13, strTmp.c_str());
sol.repalceSapce(str, 24);
cout << str << endl;
system("pause");
return 0;
}