剑指Offer[C++] 4:替换空格
面试题4
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路
遍历一遍字符串,统计字符串长度和空格数目。因为空格要替换成“%20”,因此每替换一个空格长度增加2,因此替换后的总长度=字符串长度+空格数*2。字符串从后向前替换,需要两个指针p1,p2分别指向原始字符串末尾,新字符串末尾,p1依次向前移动并将指向的字符赋值到p2指的位置,当p1指到空格时,将p1向前移动1格,且把p2向前移动3格,并插入“%20”。当p1和p2指向同一个位置时,所有空格全部替换完毕
- 代码部分
void replaceSpace(char string[],int length) {
if (string == NULL && length < 0)
return;
int originalNum = 0; //字符串长度
int blankNum = 0; //空格数
int i = 0;
while (string[i] != '\0')
{
originalNum++; //计算字符串长度
if (string[i] == ' ')
blankNum++; //计算空格数
++i;
}
int newOfLength = originalNum + blankNum * 2;
if (newOfLength > length)
return;
//从后往前替换空格
int indexOfOriginal =originalNum;
int indexOfNew = newOfLength;
while (originalNum >= 0 && indexOfNew > indexOfOriginal)
{
if (string[indexOfOriginal] == ' ')
{
string[indexOfNew--] = '0'; //因为是从后向前复制所以顺序是 0 2 %。
string[indexOfNew--] = '2';
string[indexOfNew--] = '%';
}
else
string[indexOfNew--] = string[indexOfOriginal];
indexOfOriginal--;
}