1.题目:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
public class Solution {
public String replaceSpace(StringBuffer str) {
}
}
我最初的想法是将这个StringBuffer对象转换成String对象来操作,然后用空格来分割字符串,然后再拼起来,结果一运行
也就是说当字符串尾部有空格的时候不行,分割函数分割不了,咋办?如何来感知到最后一个空格的存在呢,String类还有一个方法contains(),这个可以有
package com.wx.concurrent9;
public class TestString {
/**
* 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
* 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
*/
public static void main(String[] args) {
StringBuffer oldString = new StringBuffer("hell oworld ");
String string = TestString.repalceString(oldString);
System.out.println(string);
}
private static String repalceString(StringBuffer oldStr) {
String temp = "%20";
String toString = oldStr.toString();
boolean contains = toString.contains(" ");
if (contains) {
while (oldStr.indexOf(" ") != -1) {
int index = oldStr.indexOf(" ");
oldStr.replace(index, index + 1, temp);
}
}
return oldStr.toString();
}
}
综合来说就是利用String类来检测是否有空格,如果有则用StringBuffer(线程安全)类来找到位置并替换。
那其实可以不用String类,只用StringBuffer类更加简洁
public class TestString {
/**
* 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
* 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
*/
public static void main(String[] args) {
StringBuffer oldString = new StringBuffer("hell oworld ");
String string = TestString.repalceString(oldString);
System.out.println(string);
}
private static String repalceString(StringBuffer oldStr) {
String temp = "%20";
while(oldStr.indexOf(" ")!=-1){
int index = oldStr.indexOf(" ");
oldStr.replace(index,index+1,temp);
}
return oldStr.toString();
}
}
运行时间:25ms
占用内存:9576k
但是如果面试官要求 在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,就必须另外想办法了。
就把StringBuffer当成一个字符数组来处理,遇到空格就替换。
package com.wx.day08;
public class TestStringBuffer {
/**
* 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
* 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
*/
public static void main(String[] args) {
StringBuffer oldString = new StringBuffer("hell oworld ");
String string = TestStringBuffer.repalceString(oldString);
System.out.println(string);
}
private static String repalceString(StringBuffer oldStr) {
int n = oldStr.length();//原来字符串的长度
int ni = 0; //空格的个数
for (int i = 0; i < n; i++) {
if (oldStr.charAt(i) == ' ') {
ni++;
}
}
int newn = 2 * ni + n; //定义新字符串的长度
char[] chars=new char[newn];
int index=newn-1;
/**遍历旧字符串,如果是空格*/
while(n>0){
if (oldStr.charAt(n-1)==' '){
chars[index]='0';
index--;
chars[index]='2';
index--;
chars[index]='%';
index--;
}else {
chars[index]=oldStr.charAt(n-1);
index--;
}
n--;
}
return new String(chars);
}
}