字串處理在程式猿日常作業作業中非常常見,常見到幾乎各種語言中都已經封裝好了字串相關的API,我們只需要直接拿過來用就好,就拿Java為例,jdk中的String()類幾乎封裝了所有字串相關的操作,其方法數量有近百個,幾乎滿足了程式猿所有字串相關的操作,

正是因為這么方便,估計大多數Java程式猿都沒自己實作過字串的replace,這里正式引入一下今天的精選面試題:不依賴第三方庫 實作一個字串替換replace(String str, String target, String replacement)函式,其功能是將str中所有的target替換為replacement, 其實這道題并不涉及任何復雜或者高深的演算法,只需要掌味訓本的編程就可以做,但當我某次把這道題拿出來面試某個應屆生時,他代碼寫的磕磕絆絆的,后來我也陸陸續續用這題考過好幾個人,鮮有順暢寫出來的,是我低估了這道題的難度??
解題思路
回到題目本身,我多說兩句,仔細想想這道題其實也很簡單,然而這就難倒了一大批人,大家刷面試題前還是要先打好編程基礎, 這題的解題思路也很簡單,我們新建個StringBuilder,只需要把str中不是target的部分加進去,如果是遇到target,就把replacement字串加進去,真的沒有任何復雜的演算法 就是單純考你編程的基本功,代碼如下,
public static String replace(String str, String target, String replacement) {
// 正常這里需要對str,target,replacement做輸入校驗,這里我省略, 比如str比target端的時候可以直接回傳空字串
StringBuilder res = new StringBuilder();
for (int i = 0; i < str.length(); ) {
if (isMatch(str, i, target)) {
i += target.length(); // 如果匹配,需要直接向前跳target.length
res.append(replacement);
continue;
}
res.append(str.charAt(i++));
}
return res.toString();
}
// 單純確認從str的pos位置開始,是否和target相匹配
private static boolean isMatch(String str, int pos, String target) {
for (int i = 0; i < target.length() && i + pos < str.length(); i++) {
if (str.charAt(i + pos) != target.charAt(i)) {
return false;
}
}
return true;
}
看吧,代碼其實沒啥難度,但咋就好多明顯刷過其他面試題的人都不會呢!!!
Jdk中的replace實作
估計大多數人都沒看過Jdk中的實作,所以順帶我們來欣賞下java String類中的replace方法是如何實作的,
public String replace(CharSequence target, CharSequence replacement) {
String tgtStr = target.toString();
String replStr = replacement.toString();
int j = indexOf(tgtStr);
if (j < 0) {
return this;
}
int tgtLen = tgtStr.length();
int tgtLen1 = Math.max(tgtLen, 1);
int thisLen = length();
int newLenHint = thisLen - tgtLen + replStr.length();
if (newLenHint < 0) {
throw new OutOfMemoryError();
}
StringBuilder sb = new StringBuilder(newLenHint);
int i = 0;
do {
sb.append(this, i, j).append(replStr); // 先把未匹配字符添加進去,然后直接添加replStr
i = j + tgtLen;
} while (j < thisLen && (j = indexOf(tgtStr, j + tgtLen1)) > 0); // 找到下一個匹配的下標
return sb.append(this, i, thisLen).toString();
}
jdk中的思路和我們上面寫的思路是一致的,但jdk的代碼更為精簡,其實jdk也沒用啥高深的東西,只是在indexOf()中考慮了更多資料編碼的問題,
題目擴展
別看這道題簡單,其實它也有好多可以擴展的地方,我來隨便擴幾個供大家參考下,
- Java中字符處理肯定免不了String StringBuffer和StringBuilder,都有啥區別?
- 之前老程式猿不推薦使用 str = str + "xx"的方式拼接字串, 為什么? 而現在其實大多數情況下用StringBuilder.append和
+拼接字串就沒那么多差異了? (提示:高版本的java對+的字串拼接方式有優化)! - 上文中我們用到了字串匹配的方式,我們用的是最普通的匹配時間復雜度最差是O(mn),使用其他的匹配演算法可以大幅提升性能,你都知道有哪些字串匹配演算法?(比如大家最耳熟能詳的就是KMP)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/139157.html
標籤:其他
上一篇:Python之猜單詞游戲
下一篇:用python寫截屏小工具
