题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
//java实现
public class Solution {
public String replaceSpace(StringBuffer str) {
if (str.length() == 0)
return "";
//计算空格数
int spaceNum = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ')
spaceNum++;
}
//在原始字符串中,从后向前替换
int newLen = str.length() + spaceNum * 2;//替换后字符串的长度
int oldP = str.length() - 1;//原指针指向原字符串末尾
int newP = newLen - 1;//新指针指向替换后字符串末尾
str.setLength(newLen);
for(;oldP>=0&&oldP<newP;--oldP){
if(str.charAt(oldP)==' '){
str.setCharAt(newP--,'0');
str.setCharAt(newP--,'2');
str.setCharAt(newP--,'%');
}
else{
str.setCharAt(newP--,str.charAt(oldP));
}
}
return str.toString();
}
}
思想:
从后往前 移动复制替换
代码思路:
1.判断特殊情况,比如字符串为空或者长度小于0;
2、遍历字符串,求出字符串长度oldLen;
求出空格个数blankNum;
计算出插入%20之后的新字符串的长度newLen;
判断新字符串的长度newLen如果大于给出的数组最大可存储空间length,返回;
3、定义两个指针分别指向旧新字符串数组的末尾pOld,pNew
判断如果str[pOld]==’ ‘为空格,则将%20插入;
否则,逐个将pOld指向的字符复制到pNew指向的位置;
注意:
c++中每个字符串都以字符’\0’结尾,占一个字节;
例如”We Are Happy.”这个字符串长度是14(包括字符’\0’),替换之后字符串总长度为18
//c++实现
class Solution {
public:
void replaceSpace(char *str,int length)
{
if(str==NULL||length<=0)
return;
int oldLen;
int newLen;
int blankNum;
int i=0;
while(str[i]!='\0')//单引号注意
{
++oldLen;
if(str[i]==' ')
++blankNum;
++i;//忘记写这个?逗我?
}
newLen=oldLen+2*blankNum;
if(newLen>length)//这个判断条件忘记
return;
int pOld=oldLen;
int pNew=newLen;
while(pOld>=0&&pNew>pOld)//pOld>=0不要写成pOld>0,不要忘记等号,小细节
{
if(str[pOld]==' ')
{
str[pNew--]='0';
str[pNew--]='2';
str[pNew--]='%';
}
else
{
str[pNew--]=str[pOld];
}
--pOld;
}
}
};
所有的字符都只复制(移动)一次,因此这个算法的时间复杂度为O(n),