算法練習:將字符串中全部的空格替換爲'%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));

	}

}
相關文章
相關標籤/搜索