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

1149个回答

添加回答

//java方法就是创建一个新的stringbuffer,遍历str,每次取出str[i]和空比较,如果是,就在新的stringbuffer里添加“%20”,如果不是,就添加str[i],最后输出这个新的stringbuffer
//其实这道题拿JS或C#做就真的暴力简单,C#,JS都有一个replace函数,直接调用就OK了

public String replaceSpace(StringBuffer str) {
StringBuffer buffer=new StringBuffer( );
for(int i=0;i<str.length();i++)
{
char a=str.charAt(i);
if(String.valueOf( a ).equals( " " ))
{
buffer.append( "%20" );
}
else
{
buffer.append( a );
}
}
return buffer.toString();
}

发表于 2017-08-12 18:38:45 回复(0)
更多回答
推荐
//思路
//1:从前往
   查看全部
编辑于 2015-12-07 18:51:44 回复(96)
/*
问题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 回复(26)
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 回复(17)
RX头像 RX
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	return str.toString().replaceAll("\\s", "%20");
    }
}

发表于 2015-10-28 17:56:38 回复(35)
题目考查的肯定不是用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 回复(11)
用的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 回复(0)
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 回复(16)

思路:从前向后记录‘ ’数目,从后向前替换‘ ’。 重点:从后向前替换的时候的技巧 例如:“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 回复(2)
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 回复(5)
public  String replaceSpace(StringBuffer str) {
        
        return str.toString().replaceAll("\\s","%20");
}

使用正则表达式替换

发表于 2017-03-17 12:56:06 回复(4)
# -*- coding:utf-8-*-
classSolution:
    # s 源字符串
    def replaceSpace(self, s):
       return s.replace(' ','%20')
发表于 2016-01-31 12:00:09 回复(1)
弄个队列先把字符串进队,依次出队,遇到空格连接%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 回复(19)
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)
第二遍自己做发现了更简单的办法哟~
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 回复(4)

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)
package alex.suda.jzOffer;

import java.util.Scanner;

public class ReplaceSpace {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			String s = scanner.nextLine();
			StringBuffer str = new StringBuffer(s);
			System.out.println(replaceSpace(str));
		}
	}

	public static String replaceSpace(StringBuffer str) {
		if (str == null) {
			return null;
		}
		int blankNum = 0;
		int length = str.length();
		int newLength = 0;
		for (int i = 0; i < length; i++) {
			if (str.charAt(i) == ' ') {
				blankNum++;
			}
		}
		newLength = length + 2 * blankNum;//替换后的字符串长度
		char[] newChars = new char[newLength];//新的字符数组
		int index = newLength - 1;
		for(int i=length-1;i>=0;i--) {
			if (str.charAt(i) == ' ') {
				newChars[index--] = '0';
				newChars[index--] = '2';
				newChars[index--] = '%';
			} else {
				newChars[index--] = str.charAt(i);	
			}
		}
		return new String(newChars);
	}
}


发表于 2016-11-16 16:54:07 回复(1)
class Solution {
public:
	void replaceSpace(char *str,int length) {
		int i = 0 ;
        int j = 0;
        int nSpace = 0;
        char *pStr = NULL;
        
        pStr = (char*)malloc( sizeof(char)*length*3 );
        for( i=0, j=0; i<length;i++,j++ )
        {
            if( ' ' == str[i] )
            {
                pStr[j] = '\%';
                pStr[++j] = '2';
                pStr[++j] = '0';
            }
            else
            {
                pStr[j] = str[i];
            }
            
        }
        
        for( i=0;i<j;i++ )
        {
            str[i] = pStr[i];
        }
        
        free(pStr);
	}
};

发表于 2016-04-19 11:25:38 回复(1)
思路:遇到空格,扩充字符串长度,从右向前替换字符。

class Solution {
public:
void replaceSpace(char *str,int length) {
       int i;
        int m;
        for(i=0; i<length; i++)
            {
            if(*(str+i) ==' ')
                {
                m=i;
                length = length + 2;
                for(int j = length-1; ; j--)
                    {
                    if(j-2 == m)
                        break;
                    *(str+j) = *(str+j-2);//扩充字符串
                }
                *(str+m)='%';
                *(str+m+1)='2';
                *(str+m+2)='0';
                i=i+2;
                
                
                
            }
        }

}
};
发表于 2015-08-16 09:16:35 回复(0)
牛客网,程序员必备求职神器
QQ群:169195721
微 信:www_nowcoder_com 关注
微 博:牛客网 关注

扫一扫,把题目装进口袋