字符串处理在程序猿日常工作工作中非常常见,常见到几乎各种语言中都已经封装好了字符串相关的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()中考虑了更多数据编码的问题。

题目扩展

别看这道题简单,其实它也有好多可以扩展的地方,我来随便扩几个供大家参考下。

  1. Java中字符处理肯定免不了String StringBuffer和StringBuilder,都有啥区别?
  2. 之前老程序猿不推荐使用 str = str + "xx"的方式拼接字符串, 为什么? 而现在其实大多数情况下用StringBuilder.append和+拼接字符串就没那么多差异了? (提示:高版本的java对+的字符串拼接方式有优化)!
  3. 上文中我们用到了字符串匹配的方式,我们用的是最普通的匹配时间复杂度最差是O(mn),使用其他的匹配算法可以大幅提升性能,你都知道有哪些字符串匹配算法?(比如大家最耳熟能详的就是KMP)

欢迎关注我的面试专栏面试题精选,永久免费 持续更新,本专栏会收集我遇到的比较经典面试题,除了提供详尽的解法外还会从面试官的角度提供扩展题,希望能帮助大家找到更好的工作。另外,也征集面试题,如果你遇到了不会的题 私信告诉我,有价值的题我会给你出一篇博客。
本文来自https://blog.csdn.net/xindoo

替换字符串_面试题精选:字符串替换相关推荐

  1. c替换指定位置字符串_【JavaScript】字符串

    字符串 字符串可以是插入到引号中的任何字符.你可以使用单引号或双引号: var carname = "MI"; 可以使用索引位置来访问字符串中的每个字符: var characte ...

  2. mysql数据库批量替换字符串_数据库全文搜索批量替换字符串

    --如果是第一次执行则先创建存储过程 --如果不是第一次执行则直接修改 就可以.或者直接调用 create proc Full_Search(@string nvarchar(500),@string ...

  3. fibonacci数列前20项_面试题精选:神奇的斐波那契数列

    斐波那契数列,其最开始的几项是0.1.1.2.3.5.8.13.21.34-- ,后面的每一项是前两项之和,事实上,斐波那契在数学上有自己的严格递归定义. f0 = 0 f1 = 1 f(n) = f ...

  4. 递归 反转字符串_使用递归反转字符串

    递归 反转字符串 1.简介 在本文中,您将学习如何使用递归方法来反转字符串. 第一个程序是反转字符串,第二个程序将读取用户的输入. 在之前的文章中,我已经展示了如何不使用任何内置函数来反转字符串,以及 ...

  5. python如何连续查找字符串_在另一个字符串Python中多次查找字符串

    我尝试使用Python的预定义函数(如find和index)查看一个字符串是否存在于另一个字符串中..在 现在我的函数有两个字符串作为参数,一个是我们要搜索的字符串,另一个字符串是我们在第一个字符串中 ...

  6. 什么是java字符串_什么是java字符串

    java字符串是string类,Java程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现.字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串.因 ...

  7. java中如何替换中括号_关于Java:如何替换字符串中的括号

    我有一个包含标记的字符串列表. 令牌是: {ARG:token_name}. 我也有标记的哈希图,其中key是标记,value是我要用来替换标记的值. 当我使用" replaceAll&qu ...

  8. python字符串替换正则_【python】 字符串替换+正则

    因为看电影字幕有些不必要的想删除,此段代码用于删除{}内的内容. python 中 string的replace函数并不能直接使用 正则表达式,所以我们采取compile的方式: 其中re为正则的标准 ...

  9. vb使用字符串分隔字符串_为什么要使用字符串

    vb使用字符串分隔字符串 最近,我在一次培训课程中辅导初中生. 任务之一是编写一个类,该类可以根据某些字符串键使映射变形. 创建的初级用户之一的结果包含以下方法: void dwarwle(HashM ...

最新文章

  1. Harmony生命周期
  2. Xamarin只言片语系列
  3. javascript写字技巧_【iGeek手册】如何书写更加简洁的javascript代码?
  4. 按任意的字段旋转的存储过程
  5. Android 多线程断点下载(非原创)
  6. 软件质量保证计划_质量保证QA与质量控制QC
  7. 如果40岁仍碌碌无为,牢记2句话,最迟也是大器晚成
  8. linux没有检测到触摸板,linux – 制作没有按钮的触摸板,就像带有按...
  9. MyBatis自学(5):延迟加载
  10. 有趣的问题:C的表达式x == x,何时为假?!
  11. 数据结构 复习攻略 新手必看
  12. 游戏修改器制作教程七:注入DLL的各种姿势
  13. DOS命令大全:More命令详解
  14. 会议 | 百度首席科学家吴华图灵大会演讲:NLP技术的演变与发展
  15. 国内qq邮箱服务器,qq邮箱的服务器在国内吗(注册qq邮箱的服务器是什么)
  16. 用Maven构建 Fat JAR
  17. Svchost.exe病毒的简单处理
  18. 一站式跨境电商免费开源ERP平台,简洁的操作,助您高效工作
  19. Phaser 3 入门实例教程
  20. AndroidManifest.xml参数

热门文章

  1. 2012年总结2013展望 向岁月致敬 对未来憧憬
  2. stl Vecotr中遍历方法
  3. java list move_Java中List最重要的特性
  4. 计算机组成原理2(PCI总线结构框图)
  5. 局域网只看到少数电脑_利用局域网高速传输大文件的两种方法
  6. bci测试如何整改_基于fNIRS技术的脑机接口(BCI)
  7. Python+tkinter模拟京东旋转图片式验证码输入
  8. Python筛选Excel文件中超过一定年龄的人员信息
  9. 猜数游戏用Python应该这样写
  10. python制作手机壁纸_Python爬取手机壁纸图片