这道题目是将字符串中的空格全部转换空格。首先需要扩容,保证字符串可以在正常状态下进行工作。不会导致字符串的容量不够。主要步骤如下:
- 循环遍历求得当前字符串中的空格个数
- 算出最终被替换后的新字符串的长度
- 判断当前字符串是否有足够空间存储替换后的字符串
- 从后向前复制,遇到空格将其替换,并将其前两个字符也替换为相应字符。
#include <iostream>
#include <string>
#include <math.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
using namespace std;
class Replacement {
public:
string replaceSpace(string iniString, int length) {
int blanknum = 0;
iniString.reserve(1000);
for (int i = 0; i < iniString.size(); i++)
{
if (iniString[i] == ' ')
blanknum++;
}
int newsize = blanknum * 2 + iniString.size();
if (iniString.capacity() < newsize)
return NULL;
int j = iniString.size() - 1;
if (blanknum == 0)
return iniString;
iniString.resize(newsize,'0');
for (int i = newsize - 1; i >= 0; i--)
{
if (iniString[j] == ' ')
{
iniString[i--] = '0';
iniString[i--] = '2';
iniString[i] = '%';
j--;
}
else
iniString[i] = iniString[j--];
}
return iniString;
}
};
int main()
{
Replacement s;
string a(" hello world ");
cout << s.replaceSpace(a, a.size()) << endl;
system("pause");
return 0;
}
为什么要从后向前复制?
若是从前向后复制的话,会将第一个空格后的字符覆盖,并且影响了所有后面的字符,进而影响了整个字符串。所以我们应该是从后向前复制。