1.问题:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
2.思路:可能首先想到的应该就是 str.replaceAll("\s", "%20"),在工作当中肯定可以这样写,但是如果是面试的话,主要考的是编程能力,而不是熟悉API的程度;
一种想法是在原有的字符串进行替换,但是只适用于在替换字符的长度和被替换字符长度一致时,才可以使用;
另一种想法是在 先计算替换之后字符串的长度,再新建一个字符串,用来存放替换之后的字符串,这里采用这种方式;
3.代码:
①:不使用 StringBuilder 和 StringBuffer
public String replaceSpace(String s) { //1.判断有多少空格 int spaceNum = 0; for(int i = 0 ; i < s.length();i++){ if(s.charAt(i) == ' '){ spaceNum++; } } if(spaceNum != 0){ //2.需要的长度 int newLen = s.length() + 2 * spaceNum; char[] newChars = new char[newLen]; int position = 0; //3.开始替换 for(int i = 0 ; i < s.length() ; i++){ if(s.charAt(i) == ' '){ newChars[position++] = '%'; newChars[position++] = '2'; newChars[position++] = '0'; }else{ newChars[position++] = s.charAt(i); } } s = new String(newChars); } return s; }
②使用 StringBuffer
public String replaceSpace(StringBuffer str) { //1.判断有多少空格 int spaceNum = 0 ; for(int i = 0 ; i < str.length();i++){ if(str.charAt(i) == ' '){ spaceNum++; } } if(spaceNum != 0){ //2.需要的长度 int oldLen = str.length(); int newLen = oldLen + 2 * spaceNum; str.setLength(newLen); int position = newLen - 1; //3.开始替换,从后往前移动,每次则只移动一个字符 for(int i = oldLen - 1 ; i >= 0 ; i-- ){ if(str.charAt(i) == ' '){ str.setCharAt(position-- , '0'); str.setCharAt(position-- , '2'); str.setCharAt(position-- , '%'); }else{ str.setCharAt(position-- , str.charAt(i)); } } } return str.toString(); }
③使用 StringBuilder
public String replaceSpace(StringBuffer str) { if(str == null){ return null; } StringBuilder sb = new StringBuilder(); for(int i = 0 ; i < str.length();i++){ if(str.charAt(i) == ' '){ sb.append('%'); sb.append('2'); sb.append('0'); }else{ sb.append(str.charAt(i)); } } return sb.toString(); }