本文参考自《剑指offer》一书,代码采用Java语言。

 更多:《剑指Offer》Java实现合集

题目

  请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。

思路

  首先要询问面试官是新建一个字符串还是在原有的字符串上修改,本题要求在原有字符串上进行修改。

  若从前往后依次替换,在每次遇到空格字符时,都需要移动后面O(n)个字符,对于含有O(n)个空格字符的字符串而言,总的时间效率为O(n2)。

  转变思路:先计算出需要的总长度,然后从后往前进行复制和替换,,则每个字符只需要复制一次即可。时间效率为O(n)。

测试用例

  1.字符串中无空格

  2.字符串中含有空格(连续空格,空格在首尾等)

  3.字符串为空字符串或者为null

完整Java代码

1.根据牛客网的编程练习参考,方法的输入为StringBuffer(String无法改变长度,所以采用StringBuffer),输出为String。 

  主程序中,可以利用 StringBuffer sBuffer = new StringBuffer(str); 来获得字符串的StringBuffer。

2.代码中包含测试代码

/*** * @Description 替换空格 ** @author yongh* @date 2018年7月18日 上午11:25:52*/// 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,
// 则输出“We%20are%20happy.”。public class ReplaceSpaces {/*** 实现空格的替换*/public String replaceSpace(StringBuffer str) {if (str == null) {System.out.println("输入错误!");return null;}int length = str.length();int indexOfOriginal = length-1;for (int i = 0; i < str.length(); i++) {if (str.charAt(i) == ' ')length += 2;}str.setLength(length);int indexOfNew = length-1;while (indexOfNew > indexOfOriginal) {if (str.charAt(indexOfOriginal) != ' ') {str.setCharAt(indexOfNew--, str.charAt(indexOfOriginal));} else {str.setCharAt(indexOfNew--, '0');str.setCharAt(indexOfNew--, '2');str.setCharAt(indexOfNew--, '%');}indexOfOriginal--;}return str.toString();}// ==================================测试代码==================================/*** 输入为null*/public void test1() {System.out.print("Test1:");StringBuffer sBuffer = null;String s = replaceSpace(sBuffer);System.out.println(s);}/*** 输入为空字符串*/public void test2() {System.out.print("Test2:");StringBuffer sBuffer = new StringBuffer("");String s = replaceSpace(sBuffer);System.out.println(s);}/*** 输入字符串无空格*/public void test3() {System.out.print("Test3:");StringBuffer sBuffer = new StringBuffer("abc");String s = replaceSpace(sBuffer);System.out.println(s);}/*** 输入字符串为首尾空格,中间连续空格*/public void test4() {System.out.print("Test4:");StringBuffer sBuffer = new StringBuffer(" a b  c  ");String s = replaceSpace(sBuffer);System.out.println(s);}public static void main(String[] args) {ReplaceSpaces rs = new ReplaceSpaces();rs.test1();rs.test2();rs.test3();rs.test4();}
}

  

Test1:输入错误!
null
Test2:
Test3:abc
Test4:%20a%20b%20%20c%20%20

ReplaceSpaces

收获:如果在从前往后进行复制时,需要多次移动数据,则可以考虑从后往前复制,从而减小移动次数,提高效率。

更多:《剑指Offer》Java实现合集

转载于:https://www.cnblogs.com/yongh/p/9328270.html

【Java】 剑指offer(4) 替换空格相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java

    <LeetCode力扣练习>剑指 Offer 05. 替换空格 Java 一.资源 题目: 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输 ...

  2. ~4.1 剑指 Offer 05. 替换空格

    剑指 Offer 05. 替换空格 题目描述 思路 源代码 题目描述 思路 C++: 在 C++ 语言中, string 被设计成「可变」的类型,因此可以在不新建字符串的情况下实现原地修改. 思路: ...

  3. 剑指 Offer 05. 替换空格 三种方法

    剑指 Offer 05. 替换空格(点击立即答题) 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy.& ...

  4. 代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符

    一.344.反转字符串 力扣 思路:很简单的一个for循环双指针,left和right交换. class Solution {public void reverseString(char[] s) { ...

  5. 代码随想录算法训练营第08天 | LeetCode 344.反转字符串,541. 反转字符串2,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

    LeetCode [344. 反转字符串] 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须**原地修改输入数组**. ...

  6. LeetCode 03: T58. 最后一个单词的长度(简单); 剑指 Offer 05. 替换空格(简单); 剑指 Offer 58 - II. 左旋转字符串(简单)

    文章目录 T7: 58. 最后一个单词的长度(简单) 思路 解法: 双指针 T8: 剑指 Offer 05. 替换空格(简单) 思路 解法: replace T9: 剑指 Offer 58 - II. ...

  7. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  8. 剑指 Offer 05. 替换空格 简单

    剑指 Offer 05. 替换空格 问题: 思路: 1. 方法(一):使用额外空间 2. 在原空间上扩展,利用双指针. 问题: 请实现一个函数,把字符串 s 中的每个空格替换成"%20&qu ...

  9. 力扣-图解算法数据结构-剑指 Offer 05. 替换空格

    题目要求 力扣题解 代码 /*** @program: mydemo* @description: 剑指 Offer 05. 替换空格* @author: Mr.zeng* @create: 2021 ...

  10. 剑指 Offer 05. 替换空格(完整代码)

    文章目录 剑指 Offer 05. 替换空格 1. 核心代码 2. 完整代码 总结 剑指 Offer 05. 替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20". ...

最新文章

  1. golang中的strings.Replace
  2. linux crontab 每隔10秒执行一次
  3. Java 8中的默认方法(Defender方法)简介
  4. php js 循环对象属性,js 遍历对象的属性的代码_javascript技巧
  5. 地磅称重软件源码_【漯河衡器】导致地磅称重不准原因及处理措施
  6. analog filter
  7. Python 模拟微博登陆,亲测有效!
  8. php array_intersect() 和 array_diff() 函数
  9. MSAgent技术应用
  10. 如何使用Win7系统自带的刻录功能刻录启动光盘
  11. Sublime Text 3破解补丁
  12. Docker的卸载与安装(阿里云)
  13. word里的图片用计算机画图,word绘图教程:图形工具介绍和使用方法-word技巧-电脑技巧收藏家...
  14. 苹果WWDC将于6月8日夏季发布会苹果WWDC发布会直播地址
  15. 工业制造行业B2B电商平台解决方案
  16. 支付宝花呗提前还款————附操作图片
  17. Java项目实现文件上传FTP
  18. 科技人文丨爱上陌生人的36个问题
  19. QPS 与 TPS 简介
  20. IOS-UIWebView字体控制

热门文章

  1. 我在用的浏览器插件利器
  2. [原创]jQuery动画弹出窗体支持多种展现方式
  3. 傳統經理人的迷思(转)
  4. html select onchange 失效
  5. 【Spring AOP】基于注解的 AOP 编程
  6. SQLSERVER查询数据库所有表名及行数
  7. 被阿里带火的数据中台,不靠这三个阶段绝对失败
  8. 别再跟我提Excel了!这才是阿里大厂都在用的数据分析神器
  9. 报表性能优化方案之单数据集分页SQL实现层式报表
  10. 大学计算机张青答案,《大学计算机Ⅰ》实验报告实验一1