题干:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

分析:
这题属于简单题,思路有2.其一利用额外的空间,直接再创建一个StringBuffer,将这个Buffer中的内容向其中添加即可,遇到空格添加”%20“,反之添加其原本的内容。其二即为在原buffer上进行修改,直接在原位置上用replace替换为“%20”。
注意这里容易发生错误的是repalce方法,看下面两个例子:

我们想要将a替换为t

         StringBuffer sb = new StringBuffer();sb.append("dasd");//sb.deleteCharAt(1);sb.replace(1,2,"t");System.out.println(sb.toString());

输出为dtsd,符合预期

另外一种写法:

     StringBuffer sb = new StringBuffer();sb.append("dasd");//sb.deleteCharAt(1);sb.replace(1,1"t");System.out.println(sb.toString());

输出为dtasd,并未实现替换,而是在原位置上进行了添加,为什么呢?原因很简单,StringBuffer的replace方法源码如下:

@Overridepublic synchronized StringBuffer replace(int start, int end, String str) {toStringCache = null;super.replace(start, end, str);//继承其父类的replace方法return this;}

可见StringBuffer的replace方法是直接继承了其父类AbstractStringBuffer的replace方法,如下:

public AbstractStringBuilder replace(int start, int end, String str) {//前面几个if都是为了增强方法的鲁棒性if (start < 0)throw new StringIndexOutOfBoundsException(start);if (start > count)//count为StringBuffer中实际被使用的字符串个数throw new StringIndexOutOfBoundsException("start > length()");if (start > end)throw new StringIndexOutOfBoundsException("start > end");if (end > count)end = count;int len = str.length();int newCount = count + len - (end - start);ensureCapacityInternal(newCount);System.arraycopy(value, end, value, start + len, count - end);//此为核心步骤,利用System.arraycopy方法,将原数组的扩容len长度,扩容起始位置为start,从end及其之后的元素也要相应的向后移动len长度,明显从end开始的内容都未被删除,而是直接后移了len长度,只有start到end-1的位置被替换str.getChars(value, start);//将目标字符串添加进刚刚扩容的空闲空间内,实现替换count = newCount;return this;}

具体方法1的代码如下:

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

方法2如下:

public String replaceSpace(StringBuffer str) {StringBuffer sb = new StringBuffer();for(int i=0;i<str.length();i++){if(str.charAt(i)==' '){sb.replace(i,i+1,"%20");}}return sb.toString();}

由此可见,这么简单的一道题目,如果深挖源码的话,还是有蛮多值得思考的东西的,与君共勉~

剑指offer系列-----item3字符串空格替换相关推荐

  1. 剑指offer面试题[4]-空格替换

    题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 以输入hell ...

  2. 在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...

    点击专辑上方"蓝字"关注我吧 题目难度: 中等 原题链接[1] 今天继续更新剑指 offer 系列, 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ ...

  3. 剑指offer——面试题4:替换空格

    #剑指offer--面试题4:替换空格 此题的关键思路在于字符串的从后向前复制!!! class Solution { public:void replaceSpace(char *str,int l ...

  4. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  5. 剑指 Offer II 014. 字符串中的变位词

    剑指 Offer II 014. 字符串中的变位词 题目 示例 解答 题目来源为leetcode 题目 给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的某个变位词. 换句话说,第一个字符串 ...

  6. 剑指offer python实现_剑指offer系列python实现 日更(三)

    今天来讲讲斐波那契数列和它的孩子们~先讲个冷笑话:今天来一盘斐波那契炒饭,它等于昨天的炒饭加上前天的炒饭 ‍ 7.斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第 ...

  7. 【LeetCode】剑指 Offer 67. 把字符串转换成整数

    [LeetCode]剑指 Offer 67. 把字符串转换成整数 文章目录 [LeetCode]剑指 Offer 67. 把字符串转换成整数 package offer;public class So ...

  8. 数组中其余的排除_[leetcode 剑指offer系列] 面试题04. 二维数组中的查找

    题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题的优化空间非常大, 个人感觉很适合作为面试题, 值得一做. 大家在我的公众号"每日精选算法题"中的聊天框中回 ...

  9. 剑指offer系列-03.数组中的重复数字

    剑指offer系列第03题.数组中的重复数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字重复了,也不 ...

最新文章

  1. Linux内核网络协议栈
  2. 关于批量插入数据之我见(100万级别的数据,mysql) (转)
  3. 机器人 沈为民_会变形的机器人
  4. 关于无法加载sass 模块问题。vue2.0中报错ERROR :scss can't resolve 'scss-loader'
  5. django.core.exceptions.ImproperlyConfiguredmysqlclient 1.3.13 ornewer is required you have 0.9.2(亲测)
  6. 记录spark-yarn模式下提交自己写的java程序
  7. Struts2与FreeMarker整合
  8. 五个在线图形工具创建简单的设计元素
  9. 面向切面编程应用_应用面向方面的编程
  10. OpenGL程序运行提示“glut32.dll丢失问题”
  11. java获取硬盘序列号_Win7 64+Python3.7获取计算机硬盘信息初探
  12. KXD黑夜模式流星滑落个人主页HTML源码
  13. vc6开发一个抓包软件_开发一个软件要多少钱?app软件开发的费用
  14. UGUI Canvas
  15. mysql8.0.12怎么配置_MySQL8.0.12安装及配置
  16. mycat数据库中间件透明实现MYSQL读写分离
  17. immutability因React官方出镜之使用总结分享!
  18. matlab均值编程,均值滤波与matlab编程
  19. 打印机后台服务器修复,修复win10出现“本地打印后台处理程序服务没有运行”的方法...
  20. Oracle EBS使用adpatch工具打patch过程【Z】

热门文章

  1. 学习笔记——高等数学极限、连续
  2. python3 27270网站美女爬虫(二)
  3. android 手动设置时间 过期闹钟被触发
  4. 微信小程序实现黑白化
  5. 安装系统不求人 没有光驱和软驱也能行(7种方法)
  6. 2023 电商销售统计管理系统源码
  7. 有手就能学会的,通过提取系统Boot来获取Root权限
  8. Studio One6最新版本升级 新增20项功能详解
  9. Haproxy部署网站LB集群
  10. 将照片内存占用空间变小的简单方法