题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.
解题思路分析
对于这个题,其实使用java的同学在没有思路的情况下可以直接调用String的replace方法,但是,归根结底这道题考察的可不是咱们调用接口的能力,我也试过,在牛客网上输入这段代码也能通过
return str.toString().replace(" ", "%20");
但是就像我刚说的,这里考察的是我们思考问题的能力,回到这道题,在不考虑空间复杂度的情况下我们其实可以另外在申明一个char数组进行逐一复制,碰到空格就写入%20,这样也是行的,但是其实这道题还可以在空间复杂度在O(1)的情况下写出来。
大家思考下,我们其实就可以先计算得我们需要填补得空格有多少,然后重新设置长度,这里我们又出现了两种复制方法,一种是从前往后复制,如果是从前往后复制得话,我们会发现我们每复制一个字符就需要将后面所有的重新往后复制,这样一来时间复杂度就很高了,但是如果是从后往前复制,我们就能发现,其实每个字符就能够一次性的到达自己的最终的位置上,这样时间复杂度就降下来了。
题目源代码
private static String replaceSapce(StringBuffer str) {
if (str == null) {
return null;
}
int nSpace = 0, oldLength = str.length();
for (int i = 0; i < oldLength; i++) {
if (str.charAt(i) == ' ') {
nSpace++;
}
}
int newLength = oldLength + 2 * nSpace;
int oldIndex = oldLength - 1;
int newIndex = newLength - 1;
str.setLength(newLength);
for (; oldIndex >= 0 && oldIndex < newIndex; --oldIndex) {
if (str.charAt(oldIndex) == ' ') {
str.setCharAt(newIndex--, '0');
str.setCharAt(newIndex--, '2');
str.setCharAt(newIndex--, '%');
} else {
str.setCharAt(newIndex--, str.charAt(oldIndex));
}
}
return str.toString();
}