您的位置:首页 > Web前端

剑指Offer之替换空格

2014-09-03 18:20 225 查看
本身难度并不大,java一个replace();就可以了,或者另外开辟一个String,遍历一遍也是可行的,但是出发点并不是A题,而是考虑性能,程序在空间还有时间上的使用以及程序的鲁棒性,不过九度上的测试数据还真是大char数组要开到10^6次方。

普通的就不说了,介绍一下书中的方法。

假设str="We Are Happy";设置两个指针p1,p2。初始化为0.p1指的是原长度,p2指的是替换空格之后的。遍历一遍如果不算'\0'结尾符的话,p1=12,p2=16;

然后进行赋值操作,将p1指向的元素赋给p2,p1--,p2--。直到p1遇到一个空格,此时将“%20”插入到p2之前,p2-=3.p1--。重复操作,直到p1==p2。说明不再有空格。



其中C是上述方法,c++是另外开辟一个string。

java:

import java.util.Scanner;

public class Main {

public static void main(String[] arges) {
Scanner in = new Scanner(System.in);

while (in.hasNextLine()) {
String str = null;
str = in.nextLine();
System.out.println(str.replace(" ", "%20"));

}

}

}


c++:

#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
int main()
{

//freopen("/Users/sanyinchen/Workspaces/oc/conse/B_ali/B_ali/in.txt","r",stdin);
string templet="%20";
char str[1000000];
int n;
while(gets(str))
{
getchar();
string s="";
n=strlen(str);

for(int i=0;i<n;i++)
{
if(str[i]==' ')
{
s+=templet;
}
else
{
s+=str[i];
}
}
cout<<s<<endl;

}
return 0;
}


c:

#include <stdio.h>
int main()
{

//freopen("/Users/sanyinchen/Workspaces/oc/conse/B_ali/B_ali/in.txt","r",stdin);
char str[1000000];
int p1,p2;
while(gets(str))
{
//getchar();
p1=0;
p2=0;
for(int i=0;str[i]!='\0';i++)
{
p1++;
p2++;
if(str[i]==' ')
p2+=2;

}
while(p1>=0&&p1!=p2)
{
if(str[p1]!=' ')
{
str[p2]=str[p1];
p2--;
p1--;
}
else{
str[p2--]='0';
str[p2--]='2';
str[p2--]='%';
p1--;
}

}
printf("%s\n",str);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: