题目:请实现一个函数,把字符串中的每个空格替换成“%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
浙公网安备 33010602011771号