剑指offer题目:替换空格
/*题目:替换空格
请实现一个函数,把字符串中的每一个空格替换成“%20”,例如:输入“We are happy.”,
则输出“We%20are%20happy.”。
解题思路:
从后向前替换空格,先遍历一次字符串,统计出字符串中空格的总数,并可以由此计算出替
换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度=原字符
串长度+(2*空格个数。
从字符串的后面开始复制和替换。首先准备两个指针:p1和p2,p1指向原始字符串的末尾,
而p2指向替换之后字符串的末尾,接下来向前移动指针p1,逐个把它指向的字符复制到p2指向
的位置,直到p1碰到第一个空格为止。碰到第一个空格之后,把p1向前移动1格,在p2之前插入
字符串“%20”。由于“%20”的长度为3,同时也要把p2向前移动3格。然后再重复上面的步骤…*/
#include<iostream>
#include<string>
using namespace std;
void replaceblank(char s[], int length)//length为最大字符串长度
{
if (s == nullptr || length <= 0)
{
return;
}
int originalLength=0;//原字符串长度
int numberofblank=0;//空格数
int i = 0;
while (s[i] != '\0')
{
originalLength++;
if (s[i] == ' ')
{
numberofblank++;
}
i++;
}
//若例子为we are happy.则originallength的大小为13,没有加上'\0',为了下面写字符串索引时可以直接写,不用再减一;
int newLength = originalLength + (numberofblank * 2);//替换后的字符串长度
if (newLength > length)
{
return;
}
int indexoforiginal = originalLength;//索引下标,起始位置指向原字符串末尾
int indexofnew = newLength;//索引下标,起始位置指向替换后的字符串末尾
while (indexoforiginal >= 0 && indexofnew > indexoforiginal)
{
if (s[indexoforiginal] == ' ')
{
s[indexofnew--] = '0';//先给s[indexofnew]赋值为'0',再将下标减一
s[indexofnew--] = '2';
s[indexofnew--] = '%';
}
else
{
s[indexofnew--] = s[indexoforiginal];
}
indexoforiginal--;
}
}
int main()
{
char s[100] ;
cin.getline(s, 17);
replaceblank(s, 100);
cout << s<<endl;
return 0;
}