本文参考自《剑指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
收获:若是在从前日后进行复制时,须要屡次移动数据,则能够考虑从后往前复制,从而减少移动次数,提升效率。