时间限制:1秒 空间限制:32768K 热度指数:594664
题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
知识补充:
1、StringBuffer
是可变类,在修改字符串内容时,不会创建新的对象,因此它比String类更适合修改字符串。
- StringBuffer如何转换成数组
StringBuffer类没有提供同String一样的toCharArray方法,因此需要使用toString方法转换成String类型然后调用toCharArray方法转换成数组。
- StringBuffer的输出打印
StringBuffer对象有一个toString()方法,就是将你的缓存的字符串打印出来,是String类型的
2、单引号和双引号的区别
- 单引号引的数据,是char类型的。双引号引的数据,是String类型的;
- char定义时用单引号,只能有一个字母,数字:char c='c'。而String用双引号,可以是一个,也可能是多个字母,汉字等。就是所谓的字符串:String s="adsaf";
- char只是一个基本类型,而String 可以是一个类,可以直接引用。比如char c='c',不能直接对c调用方法。String s="abc";。这时可以调用s.charAt(0);等方法,因为String是类,这是就是对象的调用了。
- toString():转换为字符串
- toCharArray():将字符串转换为字符数组
- charAt(index):按照index索引值
- setCharAt(index,value):按照index设置
- setLength(newLength):设置长度
本人代码:
public class Solution {
public String replaceSpace(StringBuffer str) {
char[] ch = str.toString().toCharArray();
StringBuffer strr = new StringBuffer();
for(int i = 0; i < ch.length;i++){
if(ch[i] == ' '){
strr.append("%20");
}else{
strr.append(ch[i]);
}
}
return strr.toString();
}
}
改进:
考虑空间复杂度,不new对象。
如果不把字符串转换为数组,直接处理字符串也行。使用str.charAt也可以对字符串进行遍历。
如果从前向后遍历,遇到空格就替换成“%20”,那么其后的字符串的内容就会被替换掉,因为没有开辟新的字符串用的是用一个str。因此如果可以先将字符串的长度进行扩充,那么扩充的部分目前还是空可以存放东西,若从后向前更新字符串就不会出现字符串被覆盖消失的问题。
思路二:先计算需要多少空间,然后从后向前遍历,不断填充,遇到空格替换成“%20”即可。
public class Solution {
public String replaceSpace(StringBuffer str) {
//计算空格的数量
int num = 0;
for(int i = 0; i < str.length();i++){
if(str.charAt(i) == ' '){
num++;
}
}
//计算新字符串的长度
int newLength = str.length() + 2*num;
//设置两个指针,一个是从后向前遍历字符串查找空格,另一个是从后向前更新填充后的字符串
int indexOld = str.length() -1;
int indexNew = newLength - 1;
//扩充字符串长度
str.setLength(newLength);
//从后向前遍历,并进行更新
for(; indexOld >=0 && indexNew >= 0; indexOld--){
if(str.charAt(indexOld) == ' '){
str.setCharAt(indexNew--,'0');
str.setCharAt(indexNew--,'2');
str.setCharAt(indexNew--,'%');
}else{
str.setCharAt(indexNew--, str.charAt(indexOld));
}
}
return str.toString();
}
}