题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

       在网络编程中,如果URL参数中含有特殊字符,如空格、‘#’等,可能导致服务器无法获得正确的参数值。需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在‘%’后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成”%20“。再比如‘#’的ASCII码为35,即十六进制的0x23,它在URL中被替换成为”%23“。

       思路一:从前到尾扫描字符串替换,每遇到一个空格,空格后面所有字符向尾部移动两个位置,并且将空格替换成“%20”。字符串长度为n,对每个空格而言,都需要移动其后面的字符。算法的时间复杂度O(n2)。

       思路二:从尾到头扫描字符串替换,统计空格数,将字符串长度增加 空格数*2 的长度。维护两个指针p1,p2分别指向原字符串的尾部和新字符串的尾部。当p1遇到空格时,p2向前移动并替换字符为‘0’,‘2’,‘%’;当p1遇到非空格字符,将该字符移到p2指向的位置。所有的字符都只移动一次,时间复杂度o(n)。

 

代码实现:

public class Solution{
    public static void main(String[] args){
         StringBuilder sb=new StringBuilder("We are happy.");
         String s=replaceSpace(sb);
         System.out.println(s);
    } 
 
    public static String replaceSpace(StringBuilder str){
        int spaceNum=0;
        //统计空格的个数
        for(int i=0;i<str.length();i++){
           if(str.charAt(i)==' '){
              spaceNum++;
           }
        }
        //原字符串尾部对应的下标
        int oldIndex=str.length()-1;
        //新字符串尾部对应的下标
        int newIndex=str.length()+spaceNum*2-1;
        //设置新长度
        str.setLength(newIndex+1);
        while(oldIndex>=0){
           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();
    }

}

 

 posted on 2018-09-07 16:02  会飞的金鱼  阅读(102)  评论(0)    收藏  举报