题目要求
请事先一个函数,把字符串中的每个空格替换成“%20”。例如:输入“We are happer.”,输出“We%20are%20happer.”.
思路
1.时间复杂度是O(n2)解法
从头到尾扫描字符串,如果碰到空格字符串的时候,我们就将此空格替换成“%20”,也就是将一个字符替换成3个字符串,此时需要将原来的字符串往后移动两个字符串的位置
比如遇到第一个字符串空格的时候,需要替换“%20”,由于一个空格,此时替换成了3个空格,那么字符串“are happy.”需要每一个字符串往后移动两个位置(如图b)。同样,当遇到第二个字符串的时候,需要替换空格,然后后边的字符串再次移动(如图c)。注意,灰色的区域,移动了两次。所以时间复杂度为O(n2)。
2.基于以上缺点,我们可以考虑从后边遍历。
- 先遍历字符串(str),确定空格的数量为n,那么替换后的字符串的长度也就是 str.length + 2n.
- 我们可以从后遍历字符串。
- 如下图,p2表示的是替换之后的字符串的末尾,也就是(str.length + 2n)的位置,p1 表示的原字符串的末尾
- p1和p2都往前移动。每遇到一个字符的时候,将p1位置的字符移动到p2的位置上(如图b所示)。
- 当p1遇到一个空格字符串的时候,先p2先替换,之后往前移动3个位置。p1 移动一个位置(如图c所示)
- 当p1遇到下一个空格字符串的时候(如图d所示),同样的,p2位置替换 “%20”,p2向前移动3个位置,p1向前移动一个位置
- 当p1 和 p2 的位置相遇的时候,那么就结束,说明空格替换完成了
代码实现
package com.offer.test;
/**
* 替换空格,将一段字符串中的空格,替换成 "%20"
* @author zhouwenchen@021.com
* @date 2019年6月12日 下午5:31:02
*/
public class ReplaceBlack {
public static int replaceBlack(char[] str){
if(str==null){
return 0;
}
// 1.先遍历字符串中,包含的空格的数量
int newLength = str.length;
int space = 0;// 空格的个数
for(int i = 0;i < newLength;i++){
if (str[i] == ' ') {
space++;
}
}
// 替换之后新的数组的长度
newLength = str.length + space*2;
int index = newLength;
char[] result = new char[newLength];
// 2.从后向前进行
for(int i = str.length-1;i>=0;i--){
if(str[i] == ' '){
result[--index] = '0';
result[--index] = '2';
result[--index] = '%';
} else {
result[--index] = str[i];
}
}
return newLength;
}
public static void main(String[] args) {
char[] str = "We are happy.".toCharArray();
int result = replaceBlack(str);
System.out.println(result);
}
}