[剑指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));
    }
}