题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解1:使用java自带的str.replace()函数。
public class Solution {
public String replaceSpace(StringBuffer str) {
String str1 = str.toString();
String str2 = str1.replace(" ","%20");
return str2;
}
}
这样写能够通过牛客网的所有测试用例,而且代码看上去很简单。但同时可以看到运行时间和占用内存并不是最优解。
于是翻了翻牛客网里大神们的答案,找到了一个范例:
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str==null){
return null;
}
StringBuilder newStr = new StringBuilder();
for (int i=0;i<str.length();i++){
if (str.charAt(i)==' '){
newStr.append('%');
newStr.append('2');
newStr.append('0');
}else{
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}
}
加上了if( str==null )以保证程序的健壮性(初学者很容易忽略的一点),同时在对字符串进行操作时使用了Java的StringBuilder类(字符串生成器)。
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。而J2SE 5.0新增了可变的字符序列String-Builder类,大大提高了频繁增加字符串的效率。若要使用StringBuilder最后输出字符串结果,可使用toString()方法。
StringBuilder类常用方法有:
(1)append()方法
str.apend(content)
str : StringBuilder变量名
content : 追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象。
(2)inset(int offset, arg)方法
StringBuilder a = new StringBuilder("Hello");
a.insert(5, " World!");
System.out.println(a.toString());
输出结果:Hello World!
(3)delete(int start, int end)方法
移除此序列的子字符串中的字符。该子字符串从指定的start处开始,一直到索引end-1处的字符,如果不存在这种字符,则一直到序列尾部。如果start等于end,则不发生任何更改。
StringBuilder a = new StringBuilder("StringBuilder");
a.delete(5, 10);
System.out.println(a.toString());
输出结果:Strinder (下标6~9处的字符被删除)