<!-- lang: java -->
package codinginterview;
/**
* 写一个函数,把字符串中所有的空格替换为%20 。
* 分析:
* 先遍历一次字符串,得到空格个数,进而得到将空格转换成%20后的串长度 (每个空格替换为%20需要增加2个字符,x个空格增加2x个字符)。
* 然后从后向前依次对空格进行替换,非空格原样拷贝。
* 如果原串有足够大的空间, 则替换过程直接在原串上进行, 因为从后向前替换的过程中,新串用到的空间一定是旧串不需要的空间;
* 如果原串的空间不够大,或是就直接是字符串长度,那么就新开一个串来保存替换后的结果.
* @author mingdong.cheng
*
*/
public class ReplaceStr {
/**
* 新开一个数组来保存替换后的结果
* O(n)
* @param s
* @return
*/
public static String replace(String s) {
if (s == null || s.length() == 0) return s;
final char[] c = s.toCharArray();
int len = c.length;
int count = 0;
for (int i=0;i<len;i++) {
if (c[i]==' ') {
++count;
}
}
//新开一个数组来保存替换后的结果
//每个空格替换为%20后需要增加2个字符,count个空格增加2*count个字符
final char[] d = new char[len+2*count];
int idx=0;
for (int i=0;i<len;i++) {
if (c[i]==' ') {
d[idx]='%';
d[idx+1]='2';
d[idx+2]='0';
idx += 3;
} else {
d[idx]=c[i];
idx++;
}
}
return String.valueOf(d);
}
public static String replace2(String s) {
if (s == null || s.length() == 0) return s;
int len=s.length();
int count = 0;
//统计空格个数
for (int i=0;i<len;i++) {
if (s.charAt(i)==' ') {
++count;
}
}
//将原字符串扩容
for(int i=0;i<2*count;i++){
s=s.concat("\0");
}
//扩容后,原串就会有足够大的空间;替换可直接在原串上进行;
//从后向前依次对空格进行替换,非空格原样拷贝;
//因为从后向前替换的过程中,新串用到的空间一定是旧串不需要的空间
final char[] c = s.toCharArray();
int idx=len-1+2*count;
for (int i=len-1; i>=0; i--) {
if (c[i] == ' ') {
c[idx] = '0';
c[idx-1] = '2';
c[idx-2] = '%';
idx -= 3;
} else {
c[idx] = c[i];
idx--;
}
}
return String.valueOf(c);
}
public static void main(String[] args) {
String s = " i am danielcheng . i am coding ... ";
System.out.println(replace(s));
System.out.println(replace2(s));
}
}
来源:oschina
链接:https://my.oschina.net/u/182175/blog/145209