题目:替换空格
实现一个函数,把字符串中的每个空格替换成“%20”,例如:输入“we are happy.”,则输出"we%20are%20happy."
解题思路
思路一:
替换空格,这个还不简单,遍历整个整个字符串,每次碰到空格字符的时候直接进行替换就好了。这个当然能达到效果,但是想想"we"后面有空格,当替换成“%20”后,后面所有的字符都需要向后移动两个字节。当整个字符串长度为n的时候,那么时间复杂度为 O(n^2);
我们有没有更加好的方式去解这个题呢?
思路二:
首先遍历整个字符串,查找出总共有多少个空格,这样同时能得出替换后字符串的长度。每替换一个空格,长度都会增加2,这样替换后的长度=原长度+2*空格数。接下来进行复制和替换工作。首先准备两个指针:p1和p2,p1指向原始支付串的末尾,p2则指向替换之后的字符串的末尾;接下来移动指针,直到碰到第一个空格后,p1向前移动1格,在p2之前插入字符串"%20",由于“%20”的长度是3,则p2需要向前移动3格。依次向前移动,直到p1和p2指向同一位置。这样所有的字符只移动一次,算法的时间效率为O(n)。
解题代码
public static String replaceBlank(String target) {
if (target.equals("") ) return target;
char[] charTarget = target.toCharArray();
int i = 0;
int lengthSpace = 0;
// 计算出总共的空格个数
while (i < charTarget.length) {
if (charTarget[i] == ' ' ) {
lengthSpace++;
}
i++;
}
int newCharTargetLength = charTarget.length + lengthSpace * 2;
char[] newCharTarget = new char[newCharTargetLength];
// 定义两个位置的指针
int j = newCharTargetLength - 1;
i = charTarget.length - 1;
while (i >= 0) {
if (charTarget[i] != ' ') {
newCharTarget[j--] = charTarget[i--];
System.out.println("J的值: = [" + j + "]");
} else {
newCharTarget[j--] = '0';
newCharTarget[j--] = '2';
newCharTarget[j--] = '%';
i--;
}
}
return new String(newCharTarget);
}
后记
- 摘自《剑指Offter》
- 牛客网