首页 > 试题广场 >

替换空格

[编程题]替换空格
  • 热度指数:1678765 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
请实现一个函数,将一个字符串中的每个空格替换成“%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 回复(308)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuilder ans = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ' '){
                ans.append("%20");
            }else {
                ans.append(str.charAt(i));
            }
        }
        return ans.toString();
    }
}

发表于 2022-05-23 11:31:32 回复(0)
public class Solution {

	public String replaceSpace(StringBuffer str) {
		int oldStrLength = 0;
		int spaceCount = 0;
		for (int i = 0; i < str.length(); i++) {
			oldStrLength ++;
			if (str.charAt(i) == ' ') {
				spaceCount ++;
			}
		}
		int newLength = oldStrLength + spaceCount * 2;
		str.setLength(newLength);
		newLength--;
		for (int i = oldStrLength - 1; i >= 0; i--) {
			if (str.charAt(i) != ' ') {
				str.setCharAt(newLength--, str.charAt(i));
			} else {
				str.setCharAt(newLength--, '0');
				str.setCharAt(newLength--, '2');
				str.setCharAt(newLength--, '%');
			}
		}
		return str.toString();
	}

}



发表于 2021-02-25 21:50: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");
                i = i + 2;
            }
        }
        return str.toString();
    }
}
替换完,i = i + 2的原因是“%20”没必要再比较一次,直接跳到“%20”后面的内容就好了
发表于 2021-02-21 21:57:22 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	return str.toString().replaceAll("\\s","%20");
    }
}

发表于 2021-01-22 08:22:52 回复(0)
借鉴了别人的思路:
这里主要考察String和StringBuffer相互转换
String转换字符串数组,注意边界条件 
核心代码
i < str.toString().toCharArray().length
主要是将字符缓冲流转换成字符串再转换成字符串数组,这样可以遍历字符串数组,
另设字符缓冲流对象s1,即不改变原有字符数组下表索引来操作,两条线,一条逐步遍历字符串数组,
一条当遇到字符串数组中等于空格的字符,停下对新建的字符缓冲流进行拼接%20,若不等于空格则拼接
对应字符串数组的元素。
 
public  String replaceSpace(StringBuffer str) {         StringBuffer s1 = new StringBuffer();         for(int i = 0;i < str.toString().toCharArray().length;i++){             char b = str.charAt(i);             if(String.valueOf(b).equals(" ")){                 s1.append("%20");             }else{                 s1.append(b);             }         }         return s1.toString();     }

发表于 2021-01-18 13:55:43 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        char[] chars = str.toString().toCharArray();
        str = new StringBuffer();
        for(int i = 0; i<chars.length ; i++){
            if(chars[i] != ' '){
                str.append(chars[i]);
            }else{
                str.append("%20");
            }
        }
        return str.toString();
    }
}
发表于 2021-01-17 20:33:26 回复(0)
return str.toString().replace(" ", "%20");
这一句就够了吧,我不知道各位大神是什么情况,又要遍历字符,又要防止数组越界的。。。
String提供的方法就满足了吧
发表于 2020-10-13 11:45:49 回复(1)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        String result = str.toString().replaceAll(" ","%20");
        return result;
    }
}
发表于 2020-10-11 12:10:45 回复(0)
java使用StringBuffer自带的方法。
public class Solution {
    public String replaceSpace(StringBuffer str) {
        while(str.lastIndexOf(" ") != -1){
            str = str.replace(str.indexOf(" "),str.indexOf(" ") + 1, "%20");
        }
        return str.toString();
    }
}
当还有最后一个空格的时候,循环
空格只占用一个字符
每次找到第一个空格(indexOf()方法),使用replace()方法,替换。将替换后的值重新赋值给str。

发表于 2020-10-10 10:47:12 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == ' ') {
                sb.append("%20");
            }else {
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }
}

发表于 2020-10-05 13:19:59 回复(0)
public class Solution {
    public String replaceSpace (StringBuffer str) {
        // 空字符串或者长度为0的字符串无需处理
        if (str == null || str.length() == 0) return str.toString();
        // 记录有多少需要替换的空格
        int spaceCount = 0;
        // 记录原字符串长度
        int oldLength = str.length();
        for (int i = 0; i < oldLength; i++) {
            if (str.charAt(i) == ' ') spaceCount++;
        }
        // 重新设置str的长度,长度为原字符串长 + 2 * 空格数
        // 原因:每个空格需要2个额外空间
        str.setLength(oldLength + 2 * spaceCount);
        // 保持一个指针指向下次的写入位置
        int ptr = str.length() - 1;
        // 从原字符串末尾开始,分情况将字符移动到新位置
        for (int i = oldLength - 1; i >= 0; i--) {
            if (str.charAt(i) == ' ') {
                str.setCharAt(ptr--, '0');
                str.setCharAt(ptr--, '2');
                str.setCharAt(ptr--, '%');
            } else {
                str.setCharAt(ptr--, str.charAt(i));
            }
        }
        // 返回结果
        return str.toString();
    }
}
编辑于 2020-09-24 10:49:52 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll("\\s", "%20");
    }
}
发表于 2020-09-21 11:13:39 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer stb=new StringBuffer();
        for(int i=0;i<str.toString().length();++i)
        {
            char b=str.charAt(i);
            if(String.valueOf(b).equals(" "))
            {
                stb.append("20%");
            }
            else
            {
                stb.append(b);
            }
        }
        return stb.toString();
        
    }
}
class A
{
    public static void main(String[] args)
    {
        Solution solution=new Solution();
        StringBuffer str=new StringBuffer();
        str.append("we are happy");
        solution.replaceSpace(str);
    }
}
哪位大神帮我看看问题出在哪里,编译没有错误
,但是通过率为0
发表于 2020-09-15 21:10:51 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        //使用双指针的移动策略。
        //p1指向当前字符串的尾部。
        //p2指向新字符串的尾部。
        
        int p1 = str.length() - 1;
        for(int i = 0; i <= p1; i++){
            if(str.charAt(i) == ' '){
                str.append("  ");
            }
        }
        int p2 = str.length() - 1;
        
        //p1不断向前移动的过程中,同事判断当前位置上的字符是否是空格。
        //若P1指向空格,则需要P2从后向前添加‘0’,‘2’,’%‘三个字符。
        //若p2指向非空格,则将当前字符赋给p2指向的位置,从而实现字符的后移操作。
        while (p1 >= 0 && p2 > p1){
            char c = str.charAt(p1--);
            if(c == ' '){
                str.setCharAt(p2--,'0');
                str.setCharAt(p2--,'2');
                str.setCharAt(p2--,'%');
            }else{
                str.setCharAt(p2--,c);
            }
        }
        
        return str.toString();
    }
}

发表于 2020-08-30 15:59:52 回复(0)
空格占一个字节,20%占三个字节,所以每有一个空格就在str后追加两个字节.
P1指向原字符串的尾部,P2指向扩容后的字符串尾部
若P1有值,移到P2处,若P1处为空,则P2中插入20%
发表于 2020-08-25 19:30:23 回复(0)
 
return new String(str).replace(" ", "%20");
直接调用字符串方法,其实内部实现是使用正则表达式
发表于 2020-08-21 18:46:41 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll("[ ]","%20");
    }
}

发表于 2020-08-11 09:55:28 回复(0)
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	int len = str.length();
        int index = 0;
        while (len != 0) {
            if(str.charAt(index) == ' ') {
                str.insert(index, "%20");
                index += 3;
                str.deleteCharAt(index);
            } else {
                index++;
            }
            len--;
        }
        return str.toString();
    }
}

发表于 2020-07-11 22:56:33 回复(0)

问题信息

难度:
475条回答 809529浏览

热门推荐

通过挑战的用户