题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。
思路:
如果从头到尾扫描字符串,总的时间效率是O(n^2);我们换一种思路,把从前向后替换改成从后面向前替换,效率可达到O(n)。
基于以上思路,java参考代码如下:
public class ReplaceSpaces {
//由于java的字符数组没有结束符,所以需要多传入个原始长度
//先计算好替换后的位置,从后向前替换,时间复杂度o(n)
public static void replaceBlank(char[] data,int length){
int newLength = length;//不改变原有length的值
for(int i=0;i<length;i++){
if(data[i]==' ')
newLength += 2;//注意点1:加2不是3,原本有一个空格
}
for(int indexOfOld = length-1,indexOfNew=newLength-1;indexOfOld>=0 && indexOfOld!=indexOfNew;indexOfOld--,indexOfNew--){
if(data[indexOfOld]==' '){
data[indexOfNew--] = '0';
data[indexOfNew--] = '2';
data[indexOfNew] = '%'; //indexOfNew不用再自减操作,填充了原来的空格
}
else{
data[indexOfNew] = data[indexOfOld];//注意点2:没有用另外的新数组,而是在原数组上移动,节省内存空间,且可不用返回数组。
}
}
}
public static void main(String[] args){
//char[] preda=new char[]{'w',' ','a','r',' e',' ','h','a','p','p''y','.'};//注意点3:可以用原始的声明字符数组的方式,也可以用字符串转字符数组的方式。
char[] predata = "We are happy.".toCharArray();//将String类型转化为Char[]类
char[] data = new char[20];
for(int i=0;i<predata.length;i++)
data[i] = predata[i];
System.out.println(data);
replaceBlank(data,predata.length);
System.out.println(data);
}
}
注意事项见代码注释部分。
C++参考代码如下:
/*length 为字符数组string 的总容量*/
void ReplaceBlank(char sring[],int length)
{
if(string==nullptr || length<=0)
return;
/*originalLength 为字符串 string 的实际长度*/
int originalLength=0;
int numberOfBlank=0;
int i=0;
while(string[i]!='\0')
{
++originalLength;
if(string[i]==' ')
++numberOfBlank;
++i;
}
/*newLength 为把空格替换成“%20”之后的长度*/
int newLength=originalLength+numberOfBlank*2;
if(newLength>length)
return
int indexOfOriginal=originalLength;
int indexOfNew=newLength;
while(indexOfOriginal>=0 && indexOfNew>indexOfOriginal)
{
if(string[i]==' ')
{
string[indexOfNew--]='0';
string[indexOfNew--]='2';
string[indexOfNew--]='%';
}
else
{
string[indexOfNew--]=string[indexOfOriginal];
}
--indexOfOriginal;
}
}
测试用例:
a.输入的字符串中包含空格(空格位字符串的最前面;空格位于字符串的最后面;空格位于字符串的中间;字符串中有连续多个空格)。
b.输入的字符串中没有空格。
c.特殊输入测试(字符串时一个nullptr 指针;字符串是一个空字符串;字符串只有一个空格字符;字符串中有连续多个空格)。