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

324个回答

添加回答
推荐
//思路
//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 回复(227)
String stra = str.toString();
char [] chars = stra.toCharArray();
StringBuffer sb = new StringBuffer();
for (int i=0;i<chars.length;i++){
    if (chars[i]!=' '){
        sb.append(chars[i]);
    }else {
        sb.append("%20");
    }
}
return sb.toString();
将接受的字符串存到一个字符数组中,然后进行遍历,如果遇到空格,就替换成%20,否则照常输出
发表于 2019-03-21 10:54:07 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        char[] c = str.toString().replaceAll(" ", "   ").toCharArray();//将空格换成三个空格并转化为字符数组
        for(int i = 0; i < c.length ; i++){//遍历字符数组
            if(c[i] == ' '){
                c[i] = '%';//替换第一个空格
                c[i+1] ='2';//替换第二个空格
                c[i+2] = '0';   //替换第三个空格             
                i = i + 2;//索引加2跳过后两个空格
            }
        }
        return new String(c);//转换成字符串并返回
    }
}
发表于 2019-03-21 10:42:42 回复(0)
1.寻找空格的个数;
2.重新定义一个数组2,长度为插入数据后的长度
3.从后遍历,将数据一一插入到数组2中
public String replaceSpace(StringBuffer str) {
        char[] c = str.toString().toCharArray();
        int count=0;
        for(int i=0;i<str.length();i++) {
            if(c[i]==' '){
                count++;
            }
        }
        char[] newC = new char[count*2+c.length];
        for(int j=str.length()-1;j>=0;j--) {
            if(c[j]!=' ') {
                newC[j+count*2]=c[j];
            } else {
                newC[j+count*2]='0';
                newC[j+count*2-1]='2';
                newC[j+count*2-2]='%';
                count--;
            }
        }
        StringBuffer str1 = new StringBuffer();
        for(char c2 : newC) {
            str1.append(c2+"");
        }
        return str1.toString();
    }

发表于 2019-03-20 11:27:16 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll(" ","%20");
    }
}

要习惯使用Java自带函数

发表于 2019-03-19 22:38:30 回复(0)
尝试着用正则解决
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String s=new String(str);
        String b="\\s+";
        s=s.replaceAll(b,"%20");
        return s;
    }
}
case通过率37.5,主要是因为不能匹配每个空格
编辑于 2019-03-19 17:04:30 回复(0)
直接字符串拼接不就完了吗...
public class Solution {
   public String replaceSpace(StringBuffer str) {
        String str1 = str.toString();
        String str2 = "";
        char[] chars = str1.toCharArray();
        for(char c: chars){
            if(c == ' '){
                str2+= "%20";
                continue;
            }
            str2+=c;
        }
        return  str2;
    }
}
发表于 2019-03-19 13:04:13 回复(0)
首先要通过一次遍历统计字符串中空格数量,以便得出之后字符串的长度,接着,用三个index来进行
一个指针指向移动后字符的位置,称为indexnew,一个指向之前的字符位置称为indexSpace,另一个则
随时标记出空格的位置称为indexold,当indexold遇到空格,则indexSpace所指向位置的字符从后向前
依次移动到indexnew指向位置,并在最后添加0,2,%,遍历整个字符串,可得到最终解
public class Solution {
    public String replaceSpace(StringBuffer str) {
        if(str==null)
        {
            return null;
        }
        int space=0;
        for(int i=0;i<str.length();i++)
        {
            if(str.charAt(i)==' '){
                space++;
            }
        }
        int indexold = str.length()-1;
        int indexnew = str.length()+2*space-1;
        int indexSpace=str.length()-1;
        str.setLength(indexnew+1);
        while(indexold>=0){
            if(str.charAt(indexold)==' '){
                for(;indexSpace>indexold;indexSpace--){
                    str.setCharAt(indexnew,str.charAt(indexSpace));
                    indexnew--;
                }
                str.setCharAt(indexnew--,'0');
                str.setCharAt(indexnew--,'2');
                str.setCharAt(indexnew--,'%');
                indexSpace--;
            }
            indexold--;
        }
        String s =str.toString();
        return s;
        
}
}
发表于 2019-03-16 09:15:13 回复(0)
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str==null){
return null;
}
StringBuilder newStr = new StringBuilder();
for(int i =0;i<str.length();i++){
if(str.charAt(i)==' '){
newStr.append('%');
newStr.append('2');
newStr.append('0');
}else{
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}
}

当对字符串进行修改的时候,需要使用 StringBuffer StringBuilder 类。
或者正则表达式
 return str.toString().replaceAll("\\s","%20");
编辑于 2019-03-15 13:37:53 回复(0)
public static String replaceSpace(StringBuffer str) {
String s = str.substring(0,str.length());
char[] charArray = s.toCharArray();
StringBuffer sb = new StringBuffer();
for(int i =0;i<charArray.length;i++) {
if(charArray[i]==' ') {
sb.append("%20");
}else {
sb.append(charArray[i]);
}
}
return sb.substring(0,sb.length());

}
发表于 2019-03-15 13:18:00 回复(0)
// Time O(n) Space O(1)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int p1 = str.length() - 1;
        for (int i = 0; i < p1 + 1; i++) {
            if (str.charAt(i) == ' ') str.append("  ");
        }
        int p2 = str.length() - 1;
        while (p1 >= 0 && p2 >= p1) {
            if (str.charAt(p1) != ' ') {
                str.setCharAt(p2--, str.charAt(p1--));
            } else {
                str.setCharAt(p2--, '0');
                str.setCharAt(p2--, '2');
                str.setCharAt(p2--, '%');
            }
        }
        return str.toString();
    }
}

发表于 2019-03-11 22:47:31 回复(0)
        String str2 = str.toString();
        String str3 = str2.replaceAll(" ", "%20");
        return str3;

运行时间18ms,占用内存9476K,不过,看楼上大佬各种解决方案都好厉害的样子,感觉自己使用replaceAll方法是作弊行为啊,
发表于 2019-03-11 20:08:34 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replace(" ","%20");
    }
}

发表于 2019-03-11 16:09:55 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll(" ","%20");
    }
}
发表于 2019-03-11 09:56:30 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer str1 = new StringBuffer();   // 可变长度
        for(int i = 0; i < str.length(); i++)
        {
            if(str.charAt(i) == ' ')
            {
                str1.append("%20");
            }
            else
            {
                str1.append(str.charAt(i));
            }
        }
        return str1.toString();  //  没有加toString()报错
    }
}
发表于 2019-03-10 21:44:24 回复(0)
思路:使用replace函数即可。
public class Solution {
    public static String replaceSpace(StringBuffer str) {
        String str1=str.toString();
        String str2=str1.replace(" ","%20");
        return str2;
    }
    public static void mian(String[] args){
        replaceSpace(new StringBuffer("We Are Happy"));
    }
}

发表于 2019-03-09 21:23:50 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int oldlength = str.length();
        int spacenum = 0;
        for(int i=0; i<oldlength; i++ ){
            if(str.charAt(i) == ' ')
                spacenum ++;
        }
        int newlength = oldlength + spacenum * 2;
        str.setLength(newlength);
        int oldindex = oldlength - 1;
        int newindex = newlength - 1;
        while(oldindex>=0 && newindex>oldindex){
            if(str.charAt(oldindex)== ' '){
                str.setCharAt(newindex--, '0');
                str.setCharAt(newindex--, '2');
                str.setCharAt(newindex--, '%');
            }else{
                str.setCharAt(newindex--, str.charAt(oldindex));
            }
            --oldindex;
        }
        return str.toString();
    }
}

编辑于 2019-03-09 16:22:41 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        if(str.length() == 0)
            return str.toString();
   
        String res = "";
        int head = 0, tail = 0;
        while(tail < str.length())
        {
            if(str.charAt(tail) != ' ')
                tail++;
            else
            {
                res += str.substring(head, tail);
                res += "%20";         
                tail++;
                head = tail;
            }
        }
        res += str.substring(head, tail);
        return res;
    }
}
发表于 2019-03-08 00:08:57 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
      return str.toString().replaceAll(" ","%20");
    }
}
发表于 2019-03-05 22:37:51 回复(0)

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解体思路

由于java给的参数是StringBuilder,这在一定程度上给我们一定的提示,我们利用StringBuilder的charAt(i)和setCharAt(i,xxx)这两个函数可以轻易实现获取索引处元素以及对这个索引处元素进行赋值。

由于是将空格替换成%20,空格本身就算一个地方,所以我需要将原来的字符串进行扩充。扩充的长度也非常好算,就是原来的长度+空格个数*2即可。然后遍历原字符串,不是空格的就一个个搬到新长度对应的位置上,否则就塞入%20三个字符。

我的答案

public class Solution {
    public String replaceSpace(StringBuffer str) {
        //1.获取空格数量
        int count = 0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) == ' '){
                count++;
            }
        }
        //2.拿到原来字符串的长度,计算新的字符串长度
        //并且我是从尾巴开始往前遍历,所以我需要获取起始的两个索引值
        int oldLength = str.length();
        int oldIndex = oldLength - 1;
        int newLength = oldLength + 2*count;
        int newIndex = newLength - 1;
        str.setLength(newLength);
        //3.从后往前遍历原字符串,赋值给“新”的字符串,不过是原地进行的,没有开辟新的空间
        for(;oldIndex >= 0 && oldIndex < newIndex;oldIndex--){
            if(str.charAt(oldIndex) == ' '){
                str.setCharAt(newIndex--,'0');
                str.setCharAt(newIndex--,'2');
                str.setCharAt(newIndex--,'%');
            }else{
                str.setCharAt(newIndex--,str.charAt(oldIndex));
            }
        }
        return str.toString();
    }
}
编辑于 2019-03-05 22:03:47 回复(0)
return str.toString().replaceAll(" ", "%20");
就这一行代码就完事了啊,这是考不用api的方法吗?

发表于 2019-03-05 12:19:53 回复(0)

扫一扫,把题目装进口袋

牛客网,程序员必备求职神器

扫描二维码,进入QQ群

扫描二维码,关注牛客网公众号

  • 公司地址:北京市朝阳区大屯路东金泉时代3-2708北京牛客科技有限公司
  • 联系方式:010-60728802(电话) admin@nowcoder.com
  • 牛客科技©2018 All rights reserved
  • 京ICP备14055008号-4
  • 京公网安备 11010502036488号