算法练习:将字符串中所有的空格替换为'%20'(只用基本数据结构)

<!-- 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));

	}

}

转载于:https://my.oschina.net/mingdongcheng/blog/145209

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值