首页 > 试题广场 > 替换空格
[编程题]替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

1394个回答

添加回答
推荐
//思路
//1:从前往
   查看全部
编辑于 2015-12-07 18:51:44 回复(122)
/*
问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
	  从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
      从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
*/
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	int spacenum = 0;//spacenum为计算空格数
		for(int i=0;i<str.length();i++){
			if(str.charAt(i)==' ')
				spacenum++;
		}
		int indexold = str.length()-1; //indexold为为替换前的str下标
		int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
		int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
		str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
		for(;indexold>=0 && indexold<newlength;--indexold){  
				if(str.charAt(indexold) == ' '){  //
				str.setCharAt(indexnew--, '0');
				str.setCharAt(indexnew--, '2');
				str.setCharAt(indexnew--, '%');
				}else{
					str.setCharAt(indexnew--, str.charAt(indexold));
				}
		}
		return str.toString();
    }
}

发表于 2016-05-17 18:10:46 回复(28)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String sti = str.toString();
    	char[] strChar = sti.toCharArray();
        StringBuffer stb = new StringBuffer();
        for(int i=0;i<strChar.length;i++){
            if(strChar[i]==' '){
                stb.append("%20");
            }else{
                stb.append(strChar[i]);
            }
        }
        return stb.toString();
    }
}

发表于 2015-08-25 19:53:36 回复(20)
RX头像 RX
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	return str.toString().replaceAll("\\s", "%20");
    }
}

发表于 2015-10-28 17:56:38 回复(38)
用的java
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer out=new StringBuffer();
        for (int i = 0; i < str.toString().length(); i++) {
            char b=str.charAt(i);
            if(String.valueOf(b).equals(" ")){
                out.append("%20");
            }else{
                out.append(b);
            }
        }
        return out.toString();  	
    }
}

发表于 2015-09-22 11:57:46 回复(1)

思路:从前向后记录‘ ’数目,从后向前替换‘ ’。 重点:从后向前替换的时候的技巧 例如:“we are lucky”

0 1 2 3 4 5 6 7 8 9 10 11
w e a r e l u c k y

可以得知count=2;//空格的个数。 所以在替换的时候7~11的字母要向后移动count×2个位置,3~5字母要向后移动(count-1)×2个位置。 所以得到 :

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
w e   a r e   l u c  k y 
w e   a r a r e u c  k l u c k y

在替换的时候直接在空格处写入%20了

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
w e   a r e   l u c  k y 
w e % 2 0 a r e % 2  0 l u c k y
class Solution {
public:
    void replaceSpace(char *str,int length) {
        int count=0;
        for(int i=0;i<length;i++){
            if(str[i]==' ')
                count++;
        }
        for(int i=length-1;i>=0;i--){
            if(str[i]!=' '){
                str[i+2*count]=str[i];
            }
            else{
                count--;
                str[i+2*count]='%';
                str[i+2*count+1]='2';
                str[i+2*count+2]='0';
            }
        }
    }
};
发表于 2017-04-14 11:44:26 回复(5)
题目考查的肯定不是用replace函数啦~
思路是:从左到右遍历,从右到左替换。

class Solution {
public:
void replaceSpace(char *str,int length) {
for(int i = 0; i < length; i ++){
            if(*(str+i) == ' '){
                length += 2;
                int j = length -1;
                while(j-2 > i){
                    *(str+j) = *(str+j-2);
                    j--;
                }
                *(str+i) = '%';
                *(str+i+1) = '2';
                *(str+i+2) = '0';
            }
        }
}
};

发表于 2015-08-31 22:13:12 回复(14)
class Solution {
public:
	void replaceSpace(char *str,int length) {
		int spaceNum=0;
        
        for(int i=0;i<length;i++)
        {
            if(str[i]==' ')
                spaceNum++;
            
        }     
        
        int newIndex=length+2*spaceNum;
        char *index=str+length;
		while(index>=str)
        {
            if(*index==' ')
            {
                str[newIndex--]='0';
                str[newIndex--]='2';
                str[newIndex--]='%';
            }
            else{
                str[newIndex--]=*index;
            }
            index--;
        }
    }
};

发表于 2015-09-27 00:11:08 回复(10)

 这个题目是不是有问题? 如果 char *str 申请的空间是大于 length 且足够容纳替换后的字符串就万事大吉. 如果空间不够,
则必然不能原地替换, 这样也就是需要修改指针 str 指向的地址, 在传值传参的情况下, 对 str 的修改根本不可能被调用者发现.
发表于 2015-08-18 14:45:43 回复(18)
string replaceSpace(string iniString, int length) 
{
	string newString;
	for(int i=0;i<length;i++)
	{
		if(iniString[i]==' ')
		   {
		   	 //newString+=iniString[i];
		     newString=newString+"%20"; 
		     continue;
		   }
		newString+=iniString[i];
	}
	return newString; 
} 

发表于 2016-07-23 23:32:54 回复(7)
public  String replaceSpace(StringBuffer str) {
        
        return str.toString().replaceAll("\\s","%20");
}

使用正则表达式替换

发表于 2017-03-17 12:56:06 回复(4)
Java 一行搞定啊
public class Solution {
    public String replaceSpace(StringBuffer str) {
     return str.toString().replaceAll(" " , "%20");
    }
}

JavaScript
function replaceSpace(str)
{
    var resStr = str.replace(/ /g, "%20");
    return resStr;
}
发表于 2017-09-04 10:52:56 回复(0)
分析:先转为string,然后处理完成后再转为char *。但不是以返回值的形式,还要利用好原来的空间,用strcpy实现之。处理过程循环查找,每次找到就替换,且把每次的找到的结果当成下一次的参数,避免重复从头查找。

class Solution {
public:
	void replaceSpace(char *str,int length) {
        string s(str);
        int i=0;
		while((i=s.find(' ',i))>-1){
			s.erase(i,1);
            s.insert(i,"%20");
            
        }
        auto ret=s.c_str();
        strcpy(str,ret);
	}
};

发表于 2017-08-20 03:18:51 回复(3)
# -*- coding:utf-8-*-
classSolution:
    # s 源字符串
    def replaceSpace(self, s):
       return s.replace(' ','%20')
发表于 2016-01-31 12:00:09 回复(3)
弄个队列先把字符串进队,依次出队,遇到空格连接%20字符串,继续出队
发表于 2016-03-29 15:14:25 回复(2)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        if(str==null){
            return null;
        }else{
            return str.toString().replaceAll(" ","%20");
        }
    }
}
难道这不是最简单的?
发表于 2015-05-28 13:22:00 回复(20)
public class Solution {
    public String replaceSpace(StringBuffer str) {
    String strToPlace = new String(str);
    String result = strToPlace.replaceAll(" ", "%20");
        return result;
    }
}

发表于 2015-09-08 21:47:21 回复(0)
class Solution {
public:
void replaceSpace(char *str,int length) {
    int count=0;
    int i=0;
    for(i=0;i<length;i++)
    {
        if(str[i]==' ')
            count++;
    }
    for(i=length;count>0;i--)
    {
        if(str[i]!=' ')
        {
            str[i+count*2]=str[i];
        }
        else
        {
            str[i+count*2]='0';
            str[i+count*2-1]='2';
            str[i+count*2-2]='%';
            count--;
        }
    }

}
};
发表于 2015-07-21 11:04:15 回复(3)
先用.toString()方法把StringBuffer对象转成String,然后利用String的方法replaceAll即可~~
发表于 2017-09-03 10:06:40 回复(0)
第二遍自己做发现了更简单的办法哟~
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String s = str.toString();
        if(str==null)
            return s;
         char []ss=s.toCharArray();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<ss.length;i++)
            {
            if(ss[i]==' ')
                {
                 sb.append("%20");
            }
           else 
               sb.append(ss[i]);
        }
        return sb.toString();
    }
}

发表于 2017-06-23 17:08:34 回复(5)

void replaceSpace(char *str,int length) 
{
int numOfSpace = 0;
int str_size = 0;  //原字符串长度
     // 先遍历字符串找到空格的数量,确定新的字符串长度
for(int i = 0; i < length; i++)
{
   if(str[i] == ' ')
{
numOfSpace++;
}
str_size++;
if(str[i] == '\0')
break;
}
int newLength = str_size + 2*numOfSpace;
newLength--;
       //从原串后往前遍历,若不是空格,依次从新串的最后以为开始添加,若是空格也依次从后往前添                加,不过用%20代替空格,知道原串遍历完成,替换也完成。
for(int i = str_size-1; i >=0; i--)
{
   if(str[i] != ' ')
str[newLength--] = str[i];
else
{
str[newLength--] = '0';
str[newLength--] = '2';
str[newLength--] = '%';
}
}

}
发表于 2017-01-04 21:25:02 回复(0)
牛客网,程序员必备求职神器
QQ群:169195721
微 信:www_nowcoder_com 关注
微 博:牛客网 关注

扫一扫,把题目装进口袋