-
题目描述:
-
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
-
输入:
-
每个输入文件仅包含一组测试样例。
对于每组测试案例,输入一行代表要处理的字符串。
-
输出:
-
对应每个测试案例,出经过处理后的字符串。
-
样例输入:
-
We Are Happy
-
样例输出:
-
We%20Are%20Happy
这是剑指offer上面的一道题目,被九度改编成了上机题。
如果要单纯的完成这道题,有个很简单的思路就是,遇到非空格就输出,遇到空格就输出“%20”。对应代码是这样的:
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
char str[10000001];
while(gets(str))
{
int i=0;
while(str[i]!='\0')
{
if(str[i]==' ') cout<<"%20";
else cout<<str[i];
i++;
}
cout<<endl;
}
return 0;
}
/**************************************************************
Problem: 1510
User: 小燧石
Language: C++
Result: Accepted
Time:20 ms
Memory:11216 kb
****************************************************************/
但是,很明显这是一种投机取巧的办法,不是题目的本意。我想题目的本意应该是不使用其他的缓冲区,将这样的字符串转存为题目中的形式。
《剑指offer》中分析的很清楚,如果从前往后找空格,遇到空格时将后面的字符后移,这样后面的字符会多次移动,影响效率。如果先计算出空格数目,从后往前,就可以实现一个字符只移动一次。转换一个思路。效率会大增,上代码:
#include <iostream>
#include <string.h>
#include <cstdio>
usingnamespace std;
charstr[10000001];
intmain()
{
while(gets(str))
{
intnum=0,len=0;
len = strlen(str);
for(inti=0;i<len;i++)
{
if(str[i]==' ') num++;
}
for(inti=len-1;i>=0;i--)
{
str[i+num*2] = str[i];
if(str[i]==' ')
{
str[i+num*2]='0';
str[i+num*2-1]='2';
str[i+num*2-2]='%';
num--;
}
}
len = strlen(str);
for(inti=0;i<len;i++)
{
cout<<str[i];
}
cout<<endl;
}
return0;
}
/**************************************************************
Problem: 1510
User: 小燧石
Language: C++
Result: Accepted
Time:30 ms
Memory:11284 kb
****************************************************************/