2.替换空格

替换空格:

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

 

 

方法1:(牛逼)
这个方法更加简洁明了,特别厉害,就是利用了String类的replaceAll方法。
replaceAll()方法使用给定的参数replacement替换字符串给定的正则表达式的子字符串。
public String replaceAll(String regex,String replacement)
regex:匹配此字符串的正则表达式;
replacement:用来替换每个匹配项的字符串。

代码如下:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll("\\s","%20");
    }
}

顺便补充一下正则表达式里的\\s和\s的区别:
1.\作为转义字符开关,与不同的字母匹配的时候会起到不同的作用。
写成\s,表示\与s匹配,在第一次引用该段指令时就会生效,起到\s的作用。也就是表示,空白符号。
而写成\\s的时候,\会与第二个\相匹配,形成\\。其含义就是单独的一个\。这种情况,有可能是为了输出\s,而不令其转义。更常见的原因是该段字符串会被处理两次,第一次的时候将\\s处理为\s,第二次处理的时候,才执行\s的作用,即空白符号。

2.\s在正则里就表示空白符
用\\s是因为所使用的工具\本来就具有转义的功能,所以要将字符串\s传给正则用要\\s。

或者可以直接使用空格:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        return str.toString().replaceAll(" ","%20");
    }
}

 

 

方法2:
利用StringBuffer类的replace()方法:
该子字符串始于指定开始并延伸到索引end-1,或到StringBuffer结束时。
首先在子字符串中的字符串被删除,然后由指定的字符串到插入的开始。
public StringBuffer replace(int start,int end,String str)
start:开始饿索引(包括);
end:结束索引(不包括)。
str:字符串,将取代以前的内容。

代码如下:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if(ch == ' '){
                str.replace(i, i+1, "%20");
            }
        }
        return str.toString();
    }
}

 

 

方法3:

(1)先考虑是在原来的字符串上做替换(一定要保证内存够用)还是在新创建的字符串并在新的字符串上做替换。
因为“ ”替换成“%20”字符串的长度会增加;
(2)最直观的做法是O(n^2)的解法;从头到尾扫描字符串,每一次碰到空格的时候做替换,由于是把一个字符替换成3个字符,我们必须要把后面的所有字符都后移两个字节,否则就有两个字符被覆盖了。故假设字符串的长度是n,对每个空格字符,需要移动后面O(n)个字符,因此对含有O(n)个空格的字符串而言总的时间效率是O(n^2)。

但是,
如果我们换个思路:
(1)先遍历一遍字符串统计出字符串中空格的总长度,因每次替换一个空格长度+2;
故所需的总长度为oldLenth + blankCount * 2;
(2)上次我们的时间复杂度达到n的平方,是因为每次替换一个空格,我们的后面的字符串都要移动造成的,故这次我们从后往前移动,使字符在第一次就到达自己的位置上,故这样做的话时间复杂度为O(n);

用到的方法有:
(1)StringBuffer类的setLength方法,用来设置新的字符串的长度。该序列被改变到一个新的字符串序列的参数所指定的长度。
public void setLength(int newLength)
(2)该方法是StringBuffer的方法,主要作用是将字符串中指定位置的字符替换成目标字符,
setCharAt(int index,char ch),index就是取代的位置,索引从0开始,ch是你要替换的字符串。

代码如下:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int blankCount = 0;
        //先统计出空格的数量
        for (int i = 0; i < str.length(); i++) {
            if(str.charAt(i)== ' '){
                ++blankCount;
            }
        }
        int oldLength = str.length(); //得到原来字符串的长度
        int newLength = oldLength + blankCount * 2; //将空格替换为"%20"后的字符长度
        int oldIndex = oldLength - 1; //原来字符串的索引
        int newIndex = newLength - 1; //新字符串的索引
        str.setLength(newLength);
        //一次遍历,替换其中的空格为"%20"
        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();
    }
}

 

 

方法4(解除连续多个空格的情况):
新创建一个对象,这样比较稳妥一点。

代码如下:
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int len = str.length();
        String res = "%20";
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < len; i++)
        {
            if (str.charAt(i)==' ')
            {
                stringBuffer.append(res);
            }else{
                stringBuffer.append(str.charAt(i));
            }
        }

        return stringBuffer.toString();
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值