【Java】 劍指offer(4) 替換空格

本文參考自《劍指offer》一書,代碼採用Java語言。html

 更多:《劍指Offer》Java實現合集java

題目

  請實現一個函數,把字符串中的每一個空格替換成"%20"。例如輸入「We are happy.」,則輸出「We%20are%20happy.」。面試

思路

  首先要詢問面試官是新建一個字符串仍是在原有的字符串上修改,本題要求在原有字符串上進行修改。編程

  若從前日後依次替換,在每次遇到空格字符時,都須要移動後面O(n)個字符,對於含有O(n)個空格字符的字符串而言,總的時間效率爲O(n2)。app

  轉變思路:先計算出須要的總長度,而後從後往前進行復制和替換,,則每一個字符只須要複製一次便可。時間效率爲O(n)。ide

測試用例函數

  1.字符串中無空格post

  2.字符串中含有空格(連續空格,空格在首尾等)測試

  3.字符串爲空字符串或者爲nullurl

完整Java代碼

1.根據牛客網的編程練習參考,方法的輸入爲StringBuffer(String沒法改變長度,因此採用StringBuffer),輸出爲String。 

  主程序中,能夠利用 StringBuffer sBuffer = new StringBuffer(str); 來得到字符串的StringBuffer。

2.代碼中包含測試代碼

 

/**
 * 
 * @Description 替換空格 
 *
 * @author yongh
 * @date 2018年7月18日 上午11:25:52
 */

// 題目:請實現一個函數,把字符串中的每一個空格替換成"%20"。例如輸入「We are happy.」,
// 則輸出「We%20are%20happy.」。

public class ReplaceSpaces {

	/**
	 * 實現空格的替換
	 */
	public String replaceSpace(StringBuffer str) {
		if (str == null) {
			System.out.println("輸入錯誤!");
			return null;
		}
		int length = str.length();
		int indexOfOriginal = length-1;
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == ' ')
				length += 2;
		}
		str.setLength(length);
		int indexOfNew = length-1;
		while (indexOfNew > indexOfOriginal) {
			if (str.charAt(indexOfOriginal) != ' ') {
				str.setCharAt(indexOfNew--, str.charAt(indexOfOriginal));
			} else {
				str.setCharAt(indexOfNew--, '0');
				str.setCharAt(indexOfNew--, '2');
				str.setCharAt(indexOfNew--, '%');
			}
			indexOfOriginal--;
		}
		return str.toString();
	}
	
    // ==================================測試代碼==================================

	/**
	 * 輸入爲null
	 */
	public void test1() {
		System.out.print("Test1:");
		StringBuffer sBuffer = null;
		String s = replaceSpace(sBuffer);
		System.out.println(s);
	}
	
	/**
	 * 輸入爲空字符串
	 */
	public void test2() {
		System.out.print("Test2:");
		StringBuffer sBuffer = new StringBuffer("");
		String s = replaceSpace(sBuffer);
		System.out.println(s);
	}
	
	/**
	 * 輸入字符串無空格
	 */
	public void test3() {
		System.out.print("Test3:");
		StringBuffer sBuffer = new StringBuffer("abc");
		String s = replaceSpace(sBuffer);
		System.out.println(s);
	}
	
	/**
	 * 輸入字符串爲首尾空格,中間連續空格
	 */
	public void test4() {
		System.out.print("Test4:");
		StringBuffer sBuffer = new StringBuffer(" a b  c  ");
		String s = replaceSpace(sBuffer);
		System.out.println(s);
	}
	
	public static void main(String[] args) {
		ReplaceSpaces rs = new ReplaceSpaces();
		rs.test1();
		rs.test2();
		rs.test3();
		rs.test4();
	}
}

  

Test1:輸入錯誤!
null
Test2:
Test3:abc
Test4:%20a%20b%20%20c%20%20
ReplaceSpaces

 

收穫:若是在從前日後進行復制時,須要屢次移動數據,則能夠考慮從後往前複製,從而減少移動次數,提升效率。

 

 更多:《劍指Offer》Java實現合集

相關文章
相關標籤/搜索