字符串处理在程序猿平常工做工做中很是常见,常见到几乎各类语言中都已经封装好了字符串相关的API,咱们只须要直接拿过来用就好。就拿Java为例,jdk中的String()类几乎封装了全部字符串相关的操做,其方法数量有近百个,几乎知足了程序猿全部字符串相关的操做。
正是由于这么方便,估计大多数Java程序猿都没本身实现过字符串的replace。这里正式引入一下今天的精选面试题:不依赖第三方库 实现一个字符串替换replace(String str, String target, String replacement)
函数,其功能是将str中全部的target替换为replacement。 其实这道题并不涉及任何复杂或者高深的算法,只须要掌握基本的编程就能够作,但当我某次把这道题拿出来面试某个应届生时,他代码写的磕磕绊绊的,后来我也陆陆续续用这题考过好几我的,鲜有顺畅写出来的,是我低估了这道题的难度??
html
回到题目自己,我多说两句,仔细想一想这道题其实也很简单,然而这就难倒了一大批人,你们刷面试题前仍是要先打好编程基础。 这题的解题思路也很简单,咱们新建个StringBuilder,只须要把str中不是target的部分加进去,若是是遇到target,就把replacement字符串加进去,真的没有任何复杂的算法 就是单纯考你编程的基本功,代码以下。java
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中的实现,因此顺带咱们来欣赏下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()中考虑了更多数据编码的问题。编程
别看这道题简单,其实它也有好多能够扩展的地方,我来随便扩几个供你们参考下。app
+
拼接字符串就没那么多差别了? (提示:高版本的java对+
的字符串拼接方式有优化)!欢迎关注个人面试专栏面试题精选,永久免费 持续更新,本专栏会收集我遇到的比较经典面试题,除了提供详尽的解法外还会从面试官的角度提供扩展题,但愿能帮助你们找到更好的工做。另外,也征集面试题,若是你遇到了不会的题 私信告诉我,有价值的题我会给你出一篇博客。
本文来自https://blog.csdn.net/xindoo函数