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

谁说胖子不能爱 提交于 2020-03-16 17:54:36

某厂面试归来,发现自己落伍了!>>>

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

	}

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!