首页 > 试题广场 > 替换空格
[编程题]替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
推荐
//思路
//1:从前往后插入,这样移动·的次数多不建议
//2:从后往前插入

class Solution {
public:
void replaceSpace(char *str,int length) {
        //遍历一边字符串找出空格的数量
        if(str==NULL||length<0)
            return ;
        int i=0;
        int oldnumber=0;//记录以前的长度
        int replacenumber=0;//记录空格的数量
        while(str[i]!='\0')
            {
               oldnumber++;
               if(str[i]==' ')
                   {
                     replacenumber++;
                   }
                  i++; 
            }
        int newlength=oldnumber+replacenumber*2;//插入后的长度
        if(newlength>length)//如果计算后的长度大于总长度就无法插入
            return ;
        int pOldlength=oldnumber; //注意不要减一因为隐藏个‘\0’也要算里
        int pNewlength=newlength;
        while(pOldlength>=0&&pNewlength>pOldlength)//放字符
            {
              if(str[pOldlength]==' ') //碰到空格就替换
                  {
                     str[pNewlength--]='0';
                     str[pNewlength--]='2';
                     str[pNewlength--]='%';
                     
                  }
               else //不是空格就把pOldlength指向的字符装入pNewlength指向的位置
               {
                    str[pNewlength--]=str[pOldlength];
                   
               }
             pOldlength--; //不管是if还是elsr都要把pOldlength前移
             
           }
        

}
};
编辑于 2015-12-07 18:51:44 回复(252)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String str0 = new String(str);
        return str0.replaceAll(" ", "%20"); //替换全部
    }
}

发表于 2019-07-17 08:23:20 回复(0)
return new String(str).replace(" ","%20"); 一句话搞定

发表于 2019-07-13 16:47:31 回复(0)

首先发现这些题目不写主函数也可以成功通过。
那么提交主函数的过程中我遇到了如下问题:
1.String与StringBuffer的转换问题
2.replace All、repaleceFirst、spilt与正则表达式的使用(本题只使用到了replace All与正则表达式)

public class Solution {
public static String replaceSpace(StringBuffer str) {
String s = str.toString().replaceAll("[ ]","%20");
return s;
}
public static void main(String[] args){
StringBuffer str = new StringBuffer();
str.append("We Are Happy");
String s = replaceSpace(str);
System.out.println(s);
}
}

发表于 2019-07-10 11:17:52 回复(0)
    public static String stringReplaceSpace(String s){
        StringBuffer sb = new StringBuffer();
        for(int i=0,j=s.length()-1; i<=j; i++){
            char c = s.charAt(i);
            if(c == ' '){
                sb.append("%20");
            }else{
                sb.append(c);
            }
        }
        return sb.toString();
    }
发表于 2019-07-05 14:45:32 回复(1)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuilder res=new StringBuilder();
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)!=' ') res.append(str.charAt(i));
            else res.append("%20");
        }
        return res.toString();
    }
}
发表于 2019-07-04 20:50:48 回复(0)

public static String replaceSpace(StringBuffer str) {
if (str.length()<0){
return null;
}
String strr = str.toString();
//如果是\s+,则所有的连续空格都会视为一个,而如果是\s,则每个空格都会被识别出来
strr=strr.replaceAll("\s","%20");
return strr;
}

发表于 2019-07-01 20:41:05 回复(0)
for (int i = 0; i < str.length(); i++) {
            if ((str.charAt(i) + "").equals(" ")) {
                str.deleteCharAt(i);
                str.insert(i, "%20");
            }
        }

        return str.toString();
发表于 2019-06-24 10:23:39 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        /*空字符串 直接返回*/
         if (str.length() == 0) {
           return new String("");
        }
         /*字符串长度*/
       int size = str.length();
          /*空格数量*/
        int blankNum = 0;
        for (int i = 0; i < size; i++) {
            if (Character.isWhitespace( str.charAt( i ) )) {
                blankNum++;
            }
        }
         /*当前是第几个空格*/
        int level = 0;
        /*扩容字符数组  需要注意运算符的优先级 移位在 + 后面*/
        char[] buff = new char[size + (blankNum<<1)];
        for (int i = 0; i < size; i++) {
             /*把空格替换成%20*/
            if (Character.isWhitespace( str.charAt( i ) )) {
                buff[i +(level << 1)] = '%';
                buff[i + (level <<1) + 1] = '2';
                buff[i + (level << 1) + 2] = '0';
                level++;
            } else {
                 /*原来的字符 顺位移动 规则就是 i+level*2
                    每 有一个空格 就是数组长度增加2 */
                buff[i + (level <<1)] = str.charAt( i );

            }
        }
       /*构建返回对象 */
        return new String( buff );
    }
}
发表于 2019-06-20 10:24:54 回复(0)
java似乎用StringBuilder就可以很轻松的解决这个问题
发表于 2019-06-17 09:59:19 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String s=new String(str);
        s=s.replaceAll(" ","%20");
        return s;
    }
}
这7行就过了,转换成String ,调用库方法

发表于 2019-06-16 17:20:33 回复(0)
这里实现java中两种比较常见的思路,
1.使用额外的空间,申请额外的char数组进行操作
所以时间复杂度和空间复杂度都为O(n)
public String replaceSpace(StringBuffer str) {
  
  //字符串操作的特殊情况的考虑:
  if(str == null || str.length() < 0) return null;
  if(str.length() == 0) return "";
  
  //正常的实现
  int len = str.length();  //记录字符长的长度
  int countSpace = 0;   //记录包含空格的数量
 
  for(int i = 0; i < len; i++) //遍历一遍找到空格的数量
   if(str.charAt(i) == ' ')
    countSpace++;
  
  int len2 = len + 2 * countSpace; //得到新的替换后的长度
  char [] array = new char[len2];  //使用char数组保存新的替换结果
  
  //这里的从后往前插入没有任何意义,只是为了利用一下len变量,不需要在申请一个变量而已
  //从前往后添加,只不过需要一个额外的变量来指示遍历到了哪里
  for(int i = len2 - 1; i >= 0; i--,len--)
  {
   char ch = str.charAt(len - 1); //从原字符串取出字符
   if(ch != ' ') array[i] = ch;  //不是空格,直接扔到新字符串应该存在的位置
   else  //是空格,替换为题目要求
   {   
    array[i--] = '0';
    array[i--] = '2';
    array[i] = '%';
   }
  }
  return String.valueOf(array);
 }
2.不使用额外的申请,而是直接在原stringbuffer操作(动态的)
public String replaceSpace(StringBuffer str) {
  
  if(str == null && str.length() < 0) return null;
  if(str.length() == 0) return "";
  
  int lenOld = str.length();  //字符串原来的长度
  System.out.println(lenOld);
  int count = 0;     //原有字符串包含的空格数量
  for(int i = 0; i < lenOld; i++)
   if(str.charAt(i) == ' ')
    count++;
  System.out.println(count);
  
  int lenNew = lenOld + 2 * count;     //替换后字符串的长度
  str.setLength(lenNew);    //buffer动态扩容,防止下标越界
  
  for(int i = lenNew - 1; i >= 0; i--,lenOld--)
  {
   char ch = str.charAt(lenOld - 1);    //从原字符串取出字符
   if(ch != ' ') str.setCharAt(i, ch);  //不是空格,直接扔到新字符串应该存在的位置
   else  //是空格,替换为题目要求
   {   
    str.setCharAt(i--, '0');
    str.setCharAt(i--, '2');
    str.setCharAt(i, '%');
   }
  }
  
  return str.toString();
 }

编辑于 2019-06-11 17:15:03 回复(0)
public static String replaceSpace(StringBuffer str) {
    String str1 = "";  String str0 =str.toString();   if(str0.isEmpty()){ return str1;  }
    
    str1 =  str0.replace(" ","%20");   return str1; }
发表于 2019-06-07 17:10:23 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer out = new StringBuffer();
        for(int i=0; i<str.toString().length(); i++){
             char c = str.charAt(i);
            if(c==' '){
                out.append("%20");
            }else{
                out.append(c);
            }
        }
           
        return out.toString();
    }
}

发表于 2019-06-01 15:56:55 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String a = str.toString();
        String result = a.replaceAll(" ", "%20");
        return result;
    }
}
发表于 2019-05-30 15:49:27 回复(0)
public class Solution { public String replaceSpace(StringBuffer str) { return new String(str).replaceAll(" ","%20");
   }
}
发表于 2019-05-29 16:29:54 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' '){
                str.replace(i,i+1,"%20");
            }
        }
        return str.toString();
    }
}


发表于 2019-05-29 15:21:43 回复(0)
public String replaceSpace(StringBuffer str) {
        StringBuffer answer = new StringBuffer(); //实例化一个stringbuffer实例 用来存储最终答案字符串
        for (int i=0; i<str.length(); i++){  //遍历str
            if (str.charAt(i)==' '){  //如果碰到空格
                answer.append("%20") ; //则将其在答案中替换成%20
            }else answer.append(str.charAt(i)); //如果不是空格,则直接将该字符添加至答案中
        }
        return answer.toString(); //将answer转为String字符串返回
发表于 2019-05-27 19:14:34 回复(0)
思路:把字符串转换成字符数组,再新建一个可变长度的空字符串,遍历字符数组,如果是空格就向新建的字符串中添加"%20",不是空格就把当前的字符添加到新建的字符串中。
代码:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String s = str.toString();
        char[] chars = s.toCharArray();
        StringBuilder newStr = new StringBuilder();
        for(int i=0;i<chars.length;i++){
            if(chars[i]!=' '){
                newStr.append(chars[i]);
            }else{
                newStr.append("%20");
            }
        }
        return newStr.toString();
    }
}

发表于 2019-05-25 12:35:43 回复(0)
while(str.indexOf(" ")>-1){
    str=str.replace(str.indexOf(" "),str.indexOf(" ")+1,"%20");
}
return str.toString();
1、StringBuffer是自带replace方法的,但是没有replaceAll方法
2、有人把StringBuffer转成String再使用String的replaceAll方法,这种方法更简单粗暴。但我觉得这题主要考验你对StringBuffer的熟悉度,所以我还是觉得全部使用StringBuffer的方法比较好
编辑于 2019-05-23 16:07:36 回复(0)
//就是用这个啊,很简单,为什么有些人写的那么复杂
public class Solution {
    public String replaceSpace(StringBuffer str) {
    String strs = str.toString();
        strs = strs.replaceAll(" ","%20");
        return strs;
    }
}
发表于 2019-05-16 09:21:29 回复(0)