2 剑指offer——字符串
题目
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思考
该字符串是要进行修改的,最好使用stringBuffer
或者stringBuilder
。由于牛客网模板限制,使用stringBuffer
。StringBuffer
类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer
和String
类的主要区别。
stringBuffer
常见函数:
1) StringBuffer对象的初始化:
StringBuffer s = new StringBuffer();//空字符串
StringBuffer s = new StringBuffer(“abc”);//abc字符串
与string进行相互转换:
String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer
String s1 = sb1.toString(); //StringBuffer转换为String
2)追加内容:append();
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);//变为"abctrue"
使用该方法进行字符串的连接,将比String更加节约内容。
3)删除指定位置的字符:deleteCharAt();
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);//变为"Tst"
另外还存在一个删除方法:public StringBuffer delete(int start,int end)
,删除start(包括)开始,end(不包括)结束的字符。
4)插入:insert()
方法
public StringBuffer insert(int offset, boolean b);
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
5) 反转字符串:reverse()
方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
6) 修改指定位置字符串:setCharAt
方法
public void setCharAt(int index, char ch);
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);//则对象sb的值将变成”aDc”。
7) 缩小存储空间:trimToSize
方法
public void trimToSize();
该方法的作用是将StringBuffer
对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
解题
我的错误解法1
public class Solution {
public String replaceSpace(StringBuffer str) {
int len=str.length()-1;
for(int i=0;i<=len;i++){
if(str.charAt(i)==' '){
str.deleteCharAt(i);
str.insert(i,"%20");
}
}
return str.toString();
}
}
结果:
答案错误:您提交的程序没有通过所有的测试用例
case通过率为87.50%
测试用例:
” “
对应输出应该为:
“%20%20%20”
你的输出为:
“%20 “
我的错误解法2
public class Solution {
public String replaceSpace(StringBuffer str) {
int len=str.length()-1;
for(int i=0;i<=len;i++){
if(str.charAt(i)==' '){
str.replace(i,i+1,"%20");
}
}
return str.toString();
}
}
结果
答案错误:您提交的程序没有通过所有的测试用例
case通过率为87.50%
测试用例:
” “
对应输出应该为:
“%20%20%20”
你的输出为:
“%20 “
一个正确解法
public class Solution {
public String replaceSpace(StringBuffer str) {
return str.toString().replaceAll(" ","%20");
}
}
通过的代码
public class Solution {
public String replaceSpace(StringBuffer str) {
int spacenum = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' ')
spacenum++;
}//计算空字符串个数
int oldlen = str.length()-1;
int newlen = str.length()-1+spacenum*2;//计算新的字符串长度
str.setLength(newlen+1);//一定不要忘记改变字符串长度,否则容易出现内存溢出
for( ;oldlen<newlen && oldlen>=0;oldlen--){//从后向前移动字符串,将旧字符串放到新的字符串内
if(str.charAt(oldlen)==' '){
str.setCharAt(newlen--,'0');
str.setCharAt(newlen--,'2');
str.setCharAt(newlen--,'%');
}else{
str.setCharAt(newlen--,str.charAt(oldlen));
}
}
return str.toString();
}
}
这个答案是参考别人的做法做出来的,我自己原先的做法仍然不知道错哪里了。。。.。。
等之后再进行学习然后评论里改正吧。