替换空格

Posted by DH on August 4, 2017

题目

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

分析

最容易想到的就是从头开始遍历字符串,遇到空格,就把空格后面的内容后移两位,并插入%20.由于会重复的移动,所以时间复杂度是O(n2)

如果我们从后面开始遍历呢?先计算出字符串中的空格,知道最终字符串的长度,然后设置两个指针,一个指针p2指向新字符串的最后一位,p1指向旧 字符串的最后一位,如果p1指向的不为空格,就将p1拷贝到p2,如果是空格,就进行插入。

具体过程如下图:

这样,确定空格数的时候遍历了一次数组,移动的时候也只会移动一次,所以时间复杂度是O(n).

####代码

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	if (str == null) {
			return null;
		}
		
		// 字符串转化为数组
		String originalStr = str.toString();
		char [] originalChars = originalStr.toCharArray();
		
		// 遍历数组,检查数组有多少个空格
		int countOfSpace = 0;
		for(int i = 0; i < originalChars.length; i++){
			if (originalChars[i] == ' ') {
				countOfSpace ++;
			}
		}
		
		// 计算原数组和新数组的长度
		int originalArrLength = originalChars.length;
		int newArrLength = originalArrLength + countOfSpace * 2;
		char [] newArr = new char[newArrLength];
		// 将原始数组拷贝到新数组
		System.arraycopy(originalChars, 0, newArr, 0, originalArrLength);
		
		// 两个指针,p2指向替换之后字符串的末尾,p1指向源字符串的末尾
		int p1 = originalArrLength - 1;
		int p2 = newArrLength - 1;
		
		while(p1>=0 && p1 != p2){
			if (newArr[p1]==' ') {
				newArr[p2--] = '0';
				newArr[p2--] = '2';
				newArr[p2--]= '%';
			}else{
				newArr[p2--] = newArr[p1];
			}
			
			p1--;
		}
		
		String resltStr = String.valueOf(newArr);
		return resltStr.toString();
        
    }
}