面试题5:替换空格

  • 题目
    • 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
    • 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.

  • 思路
    • 就是一个空格变成了%20,也就是说每有一个空格,长度要增加2,所以首先先计算有多少个空格,这样长度就能增加多少,得到增加后的长度Length。
    • 然后new一个Length长度的字符数组,从尾到头开始复制原来的数组,如果复制过程中,如果字符不是空格,直接复制,如果字符是空格,那么需要把这个空格变成%20(这个复制过程就是把新建的数组比如现在到了 K这个位置,然后就是K,K-1,K-2这三个位置依次变成0,2,%这三个字符,因为是从后往前复制的所以是倒序),重复这个过程就行。

方法一

/**
 * @Author GJ1e
 * @Create 2019/9/11
 * @Time 20:17
 */
public class Solution {
	public String replaceSpace(StringBuffer str) {
    	if(str==null)
        	return null;

        int space = 0;
        for(int i=0;i<str.length();i++){ //记录空格数量
        	if(str.charAt(i)==' ')
                space++;
            }

        int indexOld = str.length()-1; //原字符串末尾
        int newStrLength = str.length()+2*space; //新字符串长度
        int indexNew = newStrLength-1; //新字符串末尾
        str.setLength(newStrLength); //增加原字符串的长度,防止下标越界

        while(indexOld != indexNew){ //当新字符串指针等于原字符串指针时,说明空格全部替换完毕。
            if(str.charAt(indexOld)==' ') //等于空格进行替换
            {
                indexOld--;
                str.setCharAt(indexNew--,'0'); 
                str.setCharAt(indexNew--,'2');
                str.setCharAt(indexNew--,'%');
            }
            else
            {     //不为空格则复制
                str.setCharAt(indexNew--,str.charAt(indexOld--));
            }
        }
        return str.toString();
    }
}



方法二

/**
 * @Author GJ1e
 * @Create 2019/9/11
 * @Time 20:17
 */
public class Solution {


    public String replaceSpace(StringBuffer str){

        String str1 = str.toString(); //判断非法输入
        if (str1.equals(""))
            return str1;

        char[] strArray = str1.toCharArray(); //把字符串转换成字符数组
        int i = 0;
        int lengthSpace = 0; //记录字符串数组中的空格数

        while(i<strArray.length){

            if (strArray[i] == ' ')
                lengthSpace++;
            i++;
        }

        int newStrLength = strArray.length + lengthSpace*2;
        char[] newStr = new char[newStrLength];

        int j = strArray.length-1;
        i = newStr.length-1;

        while(j>=0){

            if(strArray[j] != ' ')
            {
                newStr[i--] = strArray[j--];
            }else{
                newStr[i--] = '0';
                newStr[i--] = '2';
                newStr[i--] = '%';
                j--;
            }
        }
        return new String(newStr);

    }
}


方法一、方法二思想一样,就是写法不一样,一个用的库函数比较多,另一个比较少。 两段代码都在牛客网AC了