- 题目展示
请实现一个函数,将一个字符串中的空格替换成“%20”。 - 案例:
当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. - 思考题目
- 第一想法,直接用字符串的replace方法替换,即str.toString().replace(” “, “%20”);
- 然后拿去验证,发现竟然验证通过了。
- 本着精益求精的思想,想着可能人家想让我们自己实现replace的方法,而不是让自己直接去调用
- 然后继续寻找第二种方式
- 分析题目
- stringbuffer底层是char数组,那是不是可以遍历,然后记录下空格的index,再一个个去替换
- 解题代码(一)
/**
* 剑指offer(替换空格)
* @param str
* @return
*/
public static String replaceSpace(StringBuffer str) {
List<Integer> list = new ArrayList<Integer>();
//遍历字符,记录下空格的下标
for( int i = 0; i < str.length(); i++ )
{
if( str.charAt(i) == ' ')
list.add(i);
}
Collections.reverse(list);//将顺序反过来,因为空格替换为%20时会将后面的字符下标增加2
//遍历替换
for( Integer index : list )
{
str.replace(index, index + 1, "%20");
}
return str.toString();
}
我写出来发现,这里还是用到了stringbuffer的replace,和之前那个没什么本质区别。
那就接着寻找,代码更精细化。
- 解题代码(二)
/**
* 剑指offer(替换空格)
* @param str
* @return
*/
public String replaceSpace(StringBuffer str) {
char[] charArray = str.toString().toCharArray();//转换为字符串然后转化为字符数组
StringBuilder sBuilder = new StringBuilder();
//遍历字符数组
for (char c : charArray)
{
if(c == ' ')
{
sBuilder.append("%20");
} else
{
sBuilder.append(c);
}
}
return sBuilder.toString();
}
- 解题代码(三)
/**
* 剑指offer(替换空格)
* @param str
* @return
*/
public static String replaceSpace(StringBuffer str) {
int count = 0;//空格个数
for( int i = 0; i < str.length(); i++ )
{
if( str.charAt(i) == ' ')
count++;
}
//如果没有空格则直接返回
if( count == 0 )
return str.toString();
int len = str.length();//字符总长度
int newLen = 2 * count + len;//替换之后的总长度
int index = newLen - 1;//最后一位下标
char singleChar;//存放每一个取出来的字符
char[] ptr = new char[newLen];//创建新的char数组,用于存放新的字符
while( len > 0 ) {
singleChar = str.charAt(len - 1);//
if( singleChar != ' ' )
{
ptr[index--] = singleChar;
} else
{
ptr[index--] = '0';
ptr[index--] = '2';
ptr[index--] = '%';
}
--len;
}
return new String(ptr);
}
第三种方式思路参考自wanganyu1996的博客
- 总结:
- 虽然三种方法都能实现该操作,但是很显然,第三种才是最原始的方法,用纯粹的基础数据类型来完成。
- 用封装好的方法固然快捷和方便,但是用最原始的方式,可以让我们更加熟悉底层知识。