题目05:替换空格
请实现一个函数,把字符串中的每个空格替换成"%20"
原因:在网络编程中,如果URL参数中含有特殊字符,如:、
#
等,可能导致服务器端无法获得正确的参数值。
我们需要将这些特殊符号转换成服务器识别的字符。转换规则是在%
后面跟上ASCII码的两位十六进制的表。比如:空格的ASCII玛是32,即十六进制的0x20,因此空格被替换成“%20”。
举例说明
例如We are happy.
,则输出We%20are%20happy.
思路--时间复杂度为O(n)的解法
1. 统计空格数目
我们先遍历一次字符串,这样就能够统计出字符串中空格的综述,并可以计算出替换之后字符串的总的长度。
每替换一个空格,长度增加2,因此替换以后的字符串的长度等于原来的长度加上2乘以空格的数目,我们还是以前面的字符串”We are happy"为例,“We are happy"这个字符串的长度是14,里面有两个空格,因此替换之后的字符串的长度为18
2. 尾部开始
我们从字符串的后面开始复制和替换。
- 首先准备两个指针,P1和P2. P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。
- 接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串如(如图b)所示,灰色阴影的区域是做了字符拷贝的区域。碰到第一个空格之后,把P1向前移动一格,在P2之前插入字符串
%20
,由于%20
的长度为3,同时也要把P2向前移动3格如图所示
我们接着向前复制,直到碰到第二个空格(如图d) 所示。和上一次一样,我们再把P1向前移动1格,并把P2向前移动3格插入”%20“(如图e) - 直到P1,P2指向同一个位置,表明所有的空格都已经替换完毕。
从上面的分析我们可以看出,所有的字符都只复制一次,因此这个算法的时间效率是O(n)
代码实现
public class _05 {
public static void replaceAllBlank(String str) {//将空格转化为20%
if (str == null || str.length() <= 0) {
return;
}
int length = str.length();//初始长度
int newLength = str.length() + getBlankNum(str) * 2;//最终长度
char[] tempArray = new char[newLength];
System.arraycopy(str.toCharArray(), 0, tempArray, 0, str.toCharArray().length);
int indexofOriginal = length - 1;//P1
int indexofNew = newLength - 1;//P2
System.out.println("未替换空格时的字符串:");
printArray(str.toCharArray());
while (indexofOriginal >= 0 && indexofOriginal != indexofNew) {
if (tempArray[indexofOriginal] == ' ') {
tempArray[indexofNew--] = '0';
tempArray[indexofNew--] = '2';
tempArray[indexofNew--] = '%';
indexofOriginal--;
} else {
tempArray[indexofNew--] = tempArray[indexofOriginal--];
}
}
System.out.println("替换空格后的字符串:");
printArray(tempArray);
}
public static int getBlankNum(String str) {//计算字符串中包含的空格个数
int count = 0;
for (int i = 0; i < str.length(); i++) {
String temp = String.valueOf(str.charAt(i));
if (temp.equals(" ")) {
count++;
}
}
return count;
}
//For test
public static void printArray(char[] testArray) {// 打印char[] 数组
for (char i : testArray) {
System.out.print(i);
}
System.out.println();
}
public static void main(String[] args) {
String str = "We are happy";
replaceAllBlank(str);
}
}
输出:
未替换空格时的字符串:
We are happy
替换空格后的字符串:
We%20are%20happy