-
题目描述:
-
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
-
输入:
-
每个输入文件仅包含一组测试样例。
对于每组测试案例,输入一行代表要处理的字符串。
-
输出:
-
对应每个测试案例,出经过处理后的字符串。
-
样例输入:
We Are Happy
样例输出:We%20Are%20Happy
解法:开始想复杂了,利用链表插入 处理稍显复杂,OJ AC。时间复杂度:O(n),空间复杂度O(1)。
别的方法:
1.可以借助一个辅助空间将原字符和替换字符组合插入到新字符,指针指向。时间复杂度O(n),空间复杂度O(n)。
2.利用2个指针P1,P2指向字符串末尾,P2指向插入后的字符末尾,P1向前扫描将字符复制P2指定位置,直到P1遇到空格,插入字符。依次循环。时间复杂度O(n),空间复杂度O(1);
下面附上九度OJ 通过代码(链表插入方法);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
char str;
struct node *link;
}Node;
void Replace(char* string)
{
int i;
Node *q=NULL,*f=NULL;
if(string==NULL)return ;
for(i=0;*(string+i)!='\0';i++)
{
if(*(string+i)==' ')
{
Node *p1=(Node*)malloc(sizeof(Node));
Node *p2=(Node*)malloc(sizeof(Node));
Node *p3=(Node*)malloc(sizeof(Node));
p1->str='%';
p2->str='2';
p3->str='0';
p1->link=p2;
p2->link=p3;
p3->link=NULL;
if(f==NULL)
{
f=p1;
}
else
{
q->link=p1;
}
q=p3;
}
else
{
Node *p=(Node*)malloc(sizeof(Node));
p->str=*(string+i);
p->link=NULL;
if(f==NULL)
{
f=p;
}
else
{
q->link=p;
}
q=p;
}
}
i=0;
while(f)
{
*(string+i)=f->str;//把处理好的字符串返回
i++;
f=f->link;
}
*(string+i)='\0';//最后一定要加上这句,标识字符串结束,不然后面会有不明的字符串。
}
int main()
{
char str[1000001]=" ";
while(gets(str)) {
Replace(str);
puts(str);
}
return 0;
}
/**************************************************************
Problem: 1510
User: tcals
Language: C
Result: Accepted
Time:70 ms
Memory:11184 kb
****************************************************************/