本文參考自《劍指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
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
收穫:若是在從前日後進行復制時,須要屢次移動數據,則能夠考慮從後往前複製,從而減少移動次數,提升效率。