Java 剑指offer 05: 替换空格

欢迎关注公众号:

题目描述:

思路分析:

有以下几种方法来解决这个问题:
(1)在string中,有一种方法为replace,可以直接将空格替换为%20.

(2)定义新字符串,有空格则长度加3,然后依次遍历原来字符串,有空格则将%20添加到新字符串中。

① 在字符串尾部填充任意字符,使得字符串的长度等于替换之后的长度。因为一个空格要替换成三个字符(%20),所以当遍历到一个空格时,需要在尾部填充两个任意字符。

② 令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。

③ 当 P2 遇到 P1 时(P2 <= P1),或者遍历结束(P1 < 0),退出。

     

(3)申请一个临时数组,然后再遍历这个字符串的每个字符,如果不是空格就把遍历的字符添加到临时数组中,

如果是空格就添加3个字符'%','2','0'分别到临时数组中,最后再把临时数组转化为字符串即可。

(4)用StringBuffer来实现,遍历字符串,依次加入到StringBuffer中,遇到空格则加入%20,然后返回StringBuffer。

(5)采用栈的思想实现替换空格,数据依次入栈,有空格则加入%20,然后依次出栈,如下图所示。

实现代码如下:

package JavaOffer;
​
import java.util.Stack;
public class JavaOffer5 {
    public static void main(String[] args) {
        StringBuffer str=new StringBuffer("hello world");
        JavaOffer5 javaOffer5 = new JavaOffer5();
        String str1="hello world";
        String string=javaOffer5.solution1(str1);
        System.out.println("方法一");
        System.out.println("替换前的数组为"+str1 );
        System.out.println("替换后的数组为"+string );
    }
    public String solution1(String str){
        str=str.replace(" ","%20");
        return str;
    }
    public String solution2(StringBuffer str) {
        int P1 = str.length() - 1;
        for (int i = 0; i <= P1; i++)
            if (str.charAt(i) == ' ')
                str.append("  ");
​
        int P2 = str.length() - 1;
        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();
    }
    /*
    申请一个临时数组,然后再遍历这个字符串的每个字符,如果不是空格就把遍历的字符添加到临时数组中,
    如果是空格就添加3个字符'%','2','0'分别到临时数组中,最后再把临时数组转化为字符串即可
​
     */
    public String solution3(String string){
        int length =string.length();
        char [] tmplist =new char[3*length];
        int index=0;
        for (int i = 0;  i< length; i++) {
            char c=string.charAt(i);
            if (c==' '){
                tmplist[index++]='%';
                tmplist[index++]='2';
                tmplist[index++]='0';
            }else {
                tmplist[index++]=c;
            }
        }
        String newString =new String(tmplist,0,index);
        return newString;
    }
public  String solution4(String string){
        StringBuffer stringBuffer=new StringBuffer();
    for (int i = 0; i <string.length() ; i++) {
        if (string.charAt(i)==' '){
            stringBuffer.append("%20");
        }else {
            stringBuffer.append(string.charAt(i));
        }
    }
    return stringBuffer.toString();
​
}
public String solution5(String string) {
    Stack<Character> stack = new Stack<>();
    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < string.length(); i++) {
        if (string.charAt(i) == ' ') {
            stack.push('%');
            stack.push('2');
            stack.push('0');
        } else {
            stack.push(string.charAt(i));
        }
    }
      for (char ele :stack){
      stringBuffer.append(ele);
    }
    return stringBuffer.toString();
}
}

上述代码运行结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值