剑指offer系列-----item3字符串空格替换
题干:
请实现一个函数,将一个字符串中的每个空格替换成“%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字符串空格替换相关推荐
- 剑指offer面试题[4]-空格替换
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 以输入hell ...
- 在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...
点击专辑上方"蓝字"关注我吧 题目难度: 中等 原题链接[1] 今天继续更新剑指 offer 系列, 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ ...
- 剑指offer——面试题4:替换空格
#剑指offer--面试题4:替换空格 此题的关键思路在于字符串的从后向前复制!!! class Solution { public:void replaceSpace(char *str,int l ...
- leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列
剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...
- 剑指 Offer II 014. 字符串中的变位词
剑指 Offer II 014. 字符串中的变位词 题目 示例 解答 题目来源为leetcode 题目 给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的某个变位词. 换句话说,第一个字符串 ...
- 剑指offer python实现_剑指offer系列python实现 日更(三)
今天来讲讲斐波那契数列和它的孩子们~先讲个冷笑话:今天来一盘斐波那契炒饭,它等于昨天的炒饭加上前天的炒饭 7.斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第 ...
- 【LeetCode】剑指 Offer 67. 把字符串转换成整数
[LeetCode]剑指 Offer 67. 把字符串转换成整数 文章目录 [LeetCode]剑指 Offer 67. 把字符串转换成整数 package offer;public class So ...
- 数组中其余的排除_[leetcode 剑指offer系列] 面试题04. 二维数组中的查找
题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题的优化空间非常大, 个人感觉很适合作为面试题, 值得一做. 大家在我的公众号"每日精选算法题"中的聊天框中回 ...
- 剑指offer系列-03.数组中的重复数字
剑指offer系列第03题.数组中的重复数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字重复了,也不 ...
最新文章
- Linux内核网络协议栈
- 关于批量插入数据之我见(100万级别的数据,mysql) (转)
- 机器人 沈为民_会变形的机器人
- 关于无法加载sass 模块问题。vue2.0中报错ERROR :scss can't resolve 'scss-loader'
- django.core.exceptions.ImproperlyConfiguredmysqlclient 1.3.13 ornewer is required you have 0.9.2(亲测)
- 记录spark-yarn模式下提交自己写的java程序
- Struts2与FreeMarker整合
- 五个在线图形工具创建简单的设计元素
- 面向切面编程应用_应用面向方面的编程
- OpenGL程序运行提示“glut32.dll丢失问题”
- java获取硬盘序列号_Win7 64+Python3.7获取计算机硬盘信息初探
- KXD黑夜模式流星滑落个人主页HTML源码
- vc6开发一个抓包软件_开发一个软件要多少钱?app软件开发的费用
- UGUI Canvas
- mysql8.0.12怎么配置_MySQL8.0.12安装及配置
- mycat数据库中间件透明实现MYSQL读写分离
- immutability因React官方出镜之使用总结分享!
- matlab均值编程,均值滤波与matlab编程
- 打印机后台服务器修复,修复win10出现“本地打印后台处理程序服务没有运行”的方法...
- Oracle EBS使用adpatch工具打patch过程【Z】