牛客網劍指offer編程題--替換空格

java 字符串操作相關知識。

java字符串操作作爲最常見的面試題之一,也是一個程序員基本功的考察之一。本文藉着牛客網的刷題過程,討論一下java中的字符串處理相關知識。
字符串處理通常涉及三個對象:String、StringBuffer、StringBulid
String:在java中是一個最終類,不可以被繼承的。String在拼接的過程實際上是通過StringBuffer或者StringBulid實現的。
StringBuffer和StringBulid是動態字符串,區別就是前者是線程安全的,後者是線程不安全的。所以StringBulid的執行速度和效率都要高於前者。

上面是一個大致的總結,下面給出具體的編程題目:

題目描述

請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。
這裏需要注意的特殊情況是:字符串首位有空格、字符串全是空格的特殊情況
代碼:
public class Test {

	public static void main(String[] args) {

		StringBuffer sb = new StringBuffer();
		sb.append("he is");
		System.out.println(replaceSpace1(sb));

		StringBuffer sb1 = new StringBuffer();
		sb1.append("he is");
		System.out.println(replaceSpace1(sb1));
	}

	public static String replaceSpace(StringBuffer str) {

		String[] strArr = str.toString().split(" ");
		int length = strArr.length;
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < strArr.length; i++) {
			if (strArr[0] == " ") {
				sb.append("%20");
			}
			if (i == length - 1) {
				sb.append(strArr[i]);
			} else {
				sb.append(strArr[i]).append("%20");
			}
		}
		if (str.toString().endsWith(" ")) {
			sb.append("%20");
		}

		return sb.toString();
	}

	public static String replaceSpace1(StringBuffer str) {
		if (str == null) {
			return null;
		}
		StringBuilder newStr = new StringBuilder();
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == ' ') {
				newStr.append("%20");
			} else {
				newStr.append(str.charAt(i));
			}
		}
		return newStr.toString();
	}

}
上面的 replaceSpace1方法是參考的別人的實現代碼。
上面的 replaceSpace 方法是我自己在牛客網實現的(通過率是87.5%)。不通過的情況有下面兩種情況:
1. 字符串中僅僅是有多個空格組成的
2. 字符串的末尾空格數大於1
之所以出現上面的情況就在String的split()方法出現問題。
下面給出實際的測試代碼:
public class TestSplit {

	public static void main(String[] args) {
		//三個空格組成的字符串
		String str1 = "   ";
		//末尾含有兩個空格的字符串
		String str2 = "hello world  ";
		
		String[] str1Arr = str1.split(" ");
		String[] str2Arr = str2.split(" ");
		
		System.out.println("str1Arr.length = " + str1Arr.length);
		System.out.println("str2Arr.length = " + str2Arr.length);
		
	}

}
輸出的結果:


這就是問題所在: String的split()函數,在對字符串切分時,會忽略最後出現的空字符串。


雖然這到題目挺low,但是確實學會了很多細節知識。用正則表達式兩行代碼就可以搞定。不足和錯誤之處還望指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章