面试题5: 替换空格(Java实现)

替换空格

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

思路:首先呢,有两个思路。一种是在原字符串的基础上进行替换。这个时候每替换一个空格需要把该空格之后的字符往后面移2个位置。所以可能原字符串空间不够。第二种思路是开创一个空间足够新的数组也就是原字符串长度lenOfOrigin + 2*numberOfSpace。这个时候我们就需要向面试官询问清楚。如果第一个字符串的空间是否足够大。如果足够的话我们最好就在第一个字符串去修改。因为重新开辟一个新空间的算法有点简单,没什么可考的。

那么接下来我们来探讨如何在原字符串来替换。最简单的我们会想到时间复杂度 o ( n 2 ) o(n^2) 的算法,从前向后,每扫描到一个空格,把后面的字符向后面移动2个位置。时间复杂度 o ( n 2 ) o(n^2) 的复杂度可能面试官并不会很满意。因为还有时间复杂度o(n)的算法。

用两个指针一个p2指向str[lenOfOrigin + 2*numberOfSpace],一个p1指向lenOfOrigin。把p1向前移。边移边赋值给p2指向的位置。如果p1指向的是空格,那么p2就向前移三个。分别赋值。直到p1<0或着p1<p2。

public class Solution {
    public String replaceSpace(StringBuffer str) {
		if(str == null || str.length() == 0) {
			return "";
		}
		int len1 = 0, len2 = 0;
		int index1, index2;
		int num1 = 0;

		for (int i = 0; i < str.length(); i++) {
			len1++;
			if (str.charAt(i) == ' ') {
				num1++;
			}
		}
		len2 = len1 + num1 * 2;
		char[] arr = new char[len2];
		for (int i = 0; i < str.length(); i++) {
			arr[i] = str.charAt(i);
		}

	

		index1 = len1 - 1;
		index2 = len2 - 1;
		while (index1 >= 0 && index1 <= index2) {
			if (arr[index1] != ' ') {
				arr[index2--] = arr[index1];
			} else if (arr[index1] == ' ') {
				arr[index2--] = '0';
				arr[index2--] = '2';
				arr[index2--] = '%';
			}
			index1--;
		}

		String string = new String(arr);
		System.out.println(string);
		return string;
	}
}

代码写的有点复杂。

猜你喜欢

转载自blog.csdn.net/qq_37129433/article/details/88082489