[剑指offer_05] 替换字符串中的空格
[剑指offer_05] 替换字符串中的空格
1.替换字符串中的空格
题目描述:将一个字符串中的空格替换成“%20”。例如:当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:从后往前复制,数组长度会增加,或使用StringBuilder、StringBuffer 类
2.使用StringBuffer
/** * 解法一:使用StringBuffer * * @param str 输入字符串 * @return 输出结果 */
public static String replaceBlank1(String str){
if (str == null) {
return null;
}
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
if (String.valueOf(str.charAt(i)).equals(" ")) {
buffer.append("%20");
}else {
buffer.append(str.charAt(i));
}
}
return String.valueOf(buffer);
}
3.使用StringBuilder
/** * 解法二:使用StringBuilder * * @param str 输入字符串 * @return 输出结果 */
public static String replaceBlank2(String str) {
if (str == null){
return null;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if (String.valueOf(str.charAt(i)).equals(" ")){
sb.append("%20");
}else {
sb.append(str.charAt(i));
}
}
return String.valueOf(sb);
}
4.使用String自带的replace或replaceAll方法
/** * 解法三:使用String自带的replaceAll方法 * * @param str 输入字符串 * @return 输出结果 */
public static String replaceBlank3(String str) {
if (str == null){
return null;
}
return str.replaceAll(" ","%20");
}
5.字符数组替换
/** * 解法四:字符数组替换 * * @param str 输入字符串 * @return 输出结果 */
public static String replaceBlank4(String str) {
if (str == null){
return null;
}
int length = str.length();
char[] array = new char[length * 3];
int size = 0;
for (int i = 0; i < length; i++) {
char c = str.charAt(i);
if (c == ' ') {
array[size++] = '%';
array[size++] = '2';
array[size++] = '0';
} else {
array[size++] = c;
}
}
String newStr = new String(array, 0, size);
return newStr;
}
6.字符数组从后往前复制
/** * 解法五:从后往前复制 * * @param str 输入字符串 * @return 输出结果 */
public static String replaceBlank5(String str){
if (str == null) {
return null;
}
int blankNum = 0;
int length = str.length();
int newLength = 0;
for (int i = 0; i < length; i++) {
if (str.charAt(i) == ' ') {
blankNum++;
}
}
// 替换后的字符串长度
newLength = length + 2 * blankNum;
char[] newChars = new char[newLength];
int index = newLength - 1;
for (int i = length - 1; i >= 0; i--) {
if (str.charAt(i) == ' ') {
newChars[index--] = '0';
newChars[index--] = '2';
newChars[index--] = '%';
} else {
newChars[index--] = str.charAt(i);
}
}
return new String(newChars);
}
7.测试用例
/** * 测试Test5 * * 第5题 * 将一个字符串中的空格替换成"%20" * * @author smallz * @version 1.0 * @date 2020/3/28 18:03 */
public class Test5 {
@Test
public void test4() {
String beforeStr = " I can fly ";
System.out.println("解法一:使用StringBuffer, 替换前:" + beforeStr + " 替换后:" + ReplaceBlank4.replaceBlank1(beforeStr));
System.out.println("解法二:使用StringBuilder,替换前:" + beforeStr + " 替换后:" + ReplaceBlank4.replaceBlank2(beforeStr));
System.out.println("解法三:使用String自带的replaceAll方法,替换前:" + beforeStr + " 替换后:" + ReplaceBlank4.replaceBlank2(beforeStr));
System.out.println("解法四:字符数组复制, 替换前:" + beforeStr + " 替换后:" + ReplaceBlank4.replaceBlank3(beforeStr));
}
}