/**
* 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
* 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
*/
public class JZ002ReplaceSpaces {
/**
* 调用String类的replace()方法
* @param str
* @return
*/
public static String replaceSpace(StringBuffer str) {
return str.toString().replace(" ", "%20");
}
public static String replaceSpace2(StringBuffer str) {
int originLen = str.length();
int spaceCount = 0;
for (char c : str.toString().toCharArray()) {
if (c == ' ') {
spaceCount++;
}
}
int targetLen = originLen + spaceCount * 2;
char[] sc = new char[targetLen];
char[] c = str.toString().toCharArray();
for (int i = c.length - 1; i >= 0; i--) {
if (c[i] == ' ') {
sc[--targetLen] = '0';
sc[--targetLen] = '2';
sc[--targetLen] = '%';
} else {
sc[--targetLen] = c[i];
}
}
return new String(sc);
}
public static void main(String[] args) {
StringBuffer str = new StringBuffer("We Are Happy");
System.out.println(replaceSpace2(str));
}
/*
替换空格
总结:
1、这题在Java上看起来超级简单(原生方法的调用),但是在C++上来做,有他的深度,需要计算目标字符串的长度,从后向前添加单个元素(参考方法二)。
2、通过这题,写Java的同学需要了解String、StringBuffer、StringBuilder的区别,以及他们之间的如何转换。
2.1、String、StringBuffer、StringBuilder的区别:
- StringBuffer和StringBuilder类似,都代表可变的字符序列,而且方法也是一样的
- String:不可变字符序列(导致大量的副本字符串对象存留在内存中,这里引入堆内存和栈内存的概念)
- StringBuffer:可变字符序列、效率低、线程安全
- StringBuilder:可变字符序列、效率高、线程不安全
- 场景使用:
- 操作少量的数据用String
- 多线程操作大量数据StringBuffer
- 单线程操作大量数据StringBuilder
2.2、怎么转换:
- String转换StringBuffer
- 第一种:
String str = "hello world";
StringBuffer sb = new StringBuffer();
sb.append(str);
- 第二种:
String str = "hello world";
StringBuffer sb = new StringBuffer(str);
- StringBuffer转换String
StringBuffer sb = new StringBuffer("hello world");
String str = sb.toString();
3、了解Java中String基本的一些方法:
https://www.cnblogs.com/ABook/p/5527341.html
*/
}