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

274个回答

添加回答
推荐
//思路
//1:从前往
   查看全部
编辑于 2015-12-07 18:51:44 回复(201)
//算法思想
/*遍历整个字符串,利用StringBuffer类中的charAt()和replace(),insert()函数进行字符的替换
* 和插入,最后用toString方法返回String对象。

发表于 2018-10-16 16:39:37 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int len = str.length();
        int spaceCount = 0;
        for (int i=0; i<len; i++){
            if (str.charAt(i) == ' ')
                spaceCount++;
        }
        int newLength = len + 2*spaceCount;
        str.setLength(newLength);
        int cursor = str.length() - 1;
        for (int i=len-1; i>=0; i--){
            if (str.charAt(i) == ' '){
                str.setCharAt(cursor--, '0');
                str.setCharAt(cursor--, '2');
                str.setCharAt(cursor--, '%');
            }
            else
                str.setCharAt(cursor--, str.charAt(i));
        }
        return str.toString();
    }
}

发表于 2018-10-13 16:20:17 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String s1 =new String(str);
        s1=s1.replace(" ","%20");
        return s1;
    }
}

发表于 2018-10-12 21:39:26 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String mystr=new String(str);
        return mystr.replaceAll(" ","%20");
    }
}
发表于 2018-09-26 14:44:10 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String result = str.toString();
        result = result.replaceAll(" ","%20");
        return result;
    }
}

发表于 2018-09-20 12:28:52 回复(0)
return str.toString().replace(" ","%20");
发表于 2018-09-18 18:51:21 回复(0)
/**
 * 替换空格
 * 题目描述
 * 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 * @author yhd
 * 解题思路:
 *    由于接收的已经是StringBuffer类了,所以可以直接遍历字符串,
 *    当遇到空格时,调用其中的方法delete(int start, int end)删除空格,再调用insert(int offset, String str)方法插入%20即可
 */

public static String replaceSpace(StringBuffer str) {         int s = 0;             while(s < str.length()) {                 if(str.charAt(s) == ' ') {                     str.delete(s,s+1).insert(s, "%20");                 }                 s++;             }             return str.toString();         }


发表于 2018-09-17 19:47:32 回复(0)
package StringReplaceSpace;
import java.util.*;
public class Solution {

    public static void main(String[] args) {
        System.out.println("请输入相应的字符串:");
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            String newstr=sc.nextLine();
            Solution s=new Solution();
            String result=s.replaceSpace(newstr);
            System.out.println(result);
        }
    }

    /*
     * 定义方法Solution 返回值类型:String 参数:StringBuffer str:因为String修饰的类型是不可改变的。
     */

    public String replaceSpace(String newstr) {
        // 首先判断字符串是否为空
        if (newstr == null) {
            return null;
        }

        StringBuilder sb = new StringBuilder();
        // 循环遍历获取到每一个的字符串
        for (int i = 0; i < newstr.length(); i++) {
            // 判断是否是空格
            if (newstr.charAt(i) == ' ') {
                sb.append('%');
                sb.append('2');
                sb.append('0');
            } else {
                sb.append(newstr.charAt(i));
            }
        }
        return sb.toString();
    }

}
 
发表于 2018-09-17 16:54:38 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
       int n = str.length();
        if(str == null) return null;
        for(int i = 0;i<str.length();i++){
            char c = str.charAt(i);
            if(c == ' '){
                str.replace(i,i+1,"%20");
            }
        }
        String s = str.toString();
        return s;
    }
}
上面这段代码可以通过,但是把for循环中i<str.length() 换成 i<n 就会报错,求助为什么?
报错信息如下:
您的代码已保存 答案错误:您提交的程序没有通过所有的测试用例 case通过率为87.50% 测试用例: " " 对应输出应该为: "%20%20%20" 你的输出为: "%20 "
编辑于 2018-09-15 17:33:40 回复(0)
方法1:将str转换成字符数组strchar[],创建一个新的StringBuffer  strout,  遍历strchar[] 将里面的字符传入strout,如果是空格,则传入"%20",最后返回strout.toString;
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer strout = new StringBuffer();
        char[] strChar = str.toString().toCharArray();
        for(int i=0;i<str.toString().toCharArray().length;i++) {
            if(strChar[i]==' ') {
                strout.append("%20");
            }else {
                strout.append(strChar[i]);
            }
        }       
        return strout.toString();
    }
}
方法2:先用.toString()方法把StringBuffer对象转成String,然后利用String的replaceAll()方法;
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll(" ","%20");        
    }
}

发表于 2018-09-09 11:30:39 回复(0)
其实我的解题思路很简单,用的就是StringBuffer中的append方法。输入的时候先记录下输入的StringBuffer str的长度tmp;将str转化为字符数组逐个判断,如果不是空格,就直接将字符利用append添加到str后面,如果是空格就把“%20”添加到str后面,依次判断,依次添加,最后利用substring,从tmp处切割输出。
————————————   手动分割  ——————————————————————————
public static String replaceSpace(StringBuffer str) {
      char[]ch;
      int tmp=str.length();
         ch=str.toString().toCharArray();
         for (int i=0;i<ch.length;i++) {
    if(ch[i]==' ') {
     str.append("%20");
    }
    else {
     str.append(ch[i]);
    }
   }
         return str.toString().substring(tmp);
        
     }
发表于 2018-09-05 13:17:50 回复(0)

根据剑指offer思路来的
运行时间:13ms
占用内存:9448k

public String 
 replaceSpace(StringBuffer str) {
int blanknumber = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ')
blanknumber++;
}
int newlength=str.length()+blanknumber*2;
int indexold=str.length()-1;
int indexnew=newlength-1;
str.setLength(newlength);
while(indexold>=0&&indexnew>indexold)
{
if (str.charAt(indexold)==' ')
{
str.setCharAt(indexnew--,'0');
str.setCharAt(indexnew--,'2');
str.setCharAt(indexnew--,'%');
}
else
{
str.setCharAt(indexnew--,str.charAt(indexold));
}
indexold--;
}
System.out.println(str.toString());
return str.toString();
}

用最简单的replace方法来的
运行时间:24ms
占用内存:9596k

public String replaceSpace(StringBuffer str) 
    {
      return str.toString().replaceAll(" ","%20");
    }
编辑于 2018-09-05 11:30:42 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String str1="";
        for(int i=0;i<str.toString().length();i++){
            char ch = str.charAt(i);
            if(String.valueOf(ch).equals(" ")){
                str1+="%20";
            }else{
                str1+=String.valueOf(ch);
            }
        }
        return str1;
    }
}

发表于 2018-09-04 20:31:12 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String tempStr = "";
        for(int i=0;i<str.length();i++){
            char temp = str.charAt(i);
            if(temp==' '){
                tempStr=tempStr+"%20";
            }else{
                tempStr=tempStr+String.valueOf(temp);
            }
        }
        return tempStr.toString();
    }
}

可能我的代码算是比较简洁容易理解的了
已经通过了
思路就是在str中取出每个字符并且判断是否等于' '
要注意char字符是跟' '比较 不是“ ”(String)
然后返回拼接后的String字串
发表于 2018-09-04 14:28:21 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int cnt =0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) == ' ')
                cnt++;
        }
        char[] ret = new char[str.length()+cnt*2];
        for(int i=str.length()-1,j=ret.length-1;i>=0;i--,j--){
            ret[j] = str.charAt(i);
            if(str.charAt(i) == ' '){
                ret[j--] = '0';
                ret[j--] = '2';
                ret[j] = '%';
            }
        }
        return String.valueOf(ret);
    }
}
发表于 2018-09-03 15:22:23 回复(0)
package demo;

public class ReplaceStr {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("we are happy");
        System.out.println(replaceSpace(str));
    }
    public static String replaceSpace(StringBuffer str) {
        int oldLen = str.length();//原字符串长度
        for (int i = 0; i < oldLen; i++)
           if (str.charAt(i)==' ')//遍历原字符串
           str.append("  ");//若有空格则加两个空格,为了后面加上%20
        int P1 = oldLen - 1;//原字符串下标
        int P2 = str.length() - 1;//增加两个空格后的字符串下标
        while (P1 >= 0 && P2 > P1) {
            char c = str.charAt(P1--);//从后往前
            if (c == ' ') {
                str.setCharAt(P2--, '0');//新字符串空格补上0
                str.setCharAt(P2--, '2');//新字符串空格补上2
                str.setCharAt(P2--, '%');//新字符串空格补上%
            } else {
                str.setCharAt(P2--, c);
        }
    }
        return str.toString();
        }
/*
 * 
 */
}

编辑于 2018-08-30 14:33:24 回复(1)
//转成String,还可以用构造器
String flag;
String temp = str.toString();

flag = temp.replace(" ", "%20");
    return flag;
编辑于 2018-08-27 16:25:05 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        for (int i = 0; i < str.length(); i++) {
             if(Character.valueOf(str.charAt(i)).equals(Character.valueOf(" ".charAt(0)))){
                 str.replace(i, i+1, "%20");
             }
             
        }
        return str.toString();
    }
}
发表于 2018-08-26 18:00:30 回复(0)

采用正常的replace方式效率极低,每次替换空格前都需要把后面的字符块移动一次;作为优化,我们可以预先计算好每一个被空格分割的字符块总的需要移动的数目,每个字符块只移动一次。代码如下:

public class Solution {
    public String replaceSpace(StringBuffer str) {
        char[] origin = str.toString().toCharArray(); //原字符数组
        int[] ws = new int[origin.length]; //空格位置数组
        int wsCount = 0; //空格数量
        //1. 标记空格的位置
        for (int i=0; i<origin.length; i++) {
            if (origin[i] == ' ') {
                ws[wsCount++] = i;
            }
        }
        char[] target = new char[origin.length + wsCount * 2];//替换空格后的字符数组
        for (int i = 0; i < origin.length; i++) {
            target[i] = origin[i];
        }

        //2.从后面开始,按整体需求移动字符
        for(int i=wsCount-1; i>=0; i--) {
            int pos = ws[i]; //空格位置
            int move = (i + 1) * 2; //空格后的一段字符块需要向后移动的位数
            int start = pos + 1;
            //判断是否是结尾的字符串,如果不是,则字符块结尾是上一个空格的位置
            int end = (i != (wsCount - 1) ? ws[i + 1] : origin.length);
            move(origin, target, start, end, move);
            //替换空格
            target[start+move-1] = '0';
            target[start+move-2] = '2';
            target[start+move-3] = '%';
        }

        return new String(target);
    }

    //将origin数组的[start, end)向右移动move格,存到target中
    public void move(char[] origin, char[] target, int start, int end, int move) {
        for(int i=end-1; i>=start; i--) {
            target[i+move] = origin[i];
        }
    }
}
发表于 2018-08-25 20:58:28 回复(0)
//哈哈
public class Solution {
    public String replaceSpace(StringBuffer str) {
           String s=str.toString(); 
           String s1=s.replace(" ","%20");
           return s1;
               }
}
发表于 2018-08-23 16:28:52 回复(0)

扫一扫,把题目装进口袋

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

扫描二维码,进入QQ群

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