学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

题目链接:
替换空格

文章目录

  • 题目描述
    • 解题思路
    • 总结

题目描述

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

注意:C++解法中,给定的字符串结尾后面还有一定的空间,不然我们还得重新给它分配足够的内存空间才能将空格换成%20。在写题过程中,我们需要判断替换后的字符串是否会超过给定的内存空间长度,超过了就直接返回。Java解法需要自己重新分配内存空间。

解题思路

O(n2)的思路就不写了,直接就是从前开始遍历,遇到空格就将后面所有剩余的字符串往后移动两个位置,然后前面的空格后面就多了两个空位置,写上%20即可。

O(n)的解法:
这种题型,要很容易想到从后往前扫描字符串。我们可以这样:先计算出该字符串有几个空格,然后算出替换后的字符串一共需要多少空间的长度。我们从字符串的后面开始准备复制和替换。可以看以下图示过程:

其中,p2是指向替换后字符串的结尾处应该在哪里,p1是指向替换前,字符串的结尾处。

我们从字符串的后面开始复制和替换,当p1指向的是字符,则将字符复制给p2位置。同时,p1和p2同时向前移动。当p1遇到空格,则p2处赋值字符’0’;p2再向前移动一格,p2处赋值字符’2’;p2再向前移动一格,p2处赋值字符’%’。然后p1和p2再同时向前移动一格。以此类推最终将所有空格替换完成。

java代码:

public class Solution {public String replaceSpace(StringBuffer str) {int knum=0;/*计算空格的数量与字符串的长度*/for(int i=0;i<str.length();i++){if(str.charAt(i)==' ')knum++;}/* 替换空格后的字符串的长度 */int newlen=str.length()+2*knum;int p1=str.length()-1,p2=newlen-1;str.setLength(newlen);while(p1>=0 && p2>p1){sif(str.charAt(p1)==' '){str.setCharAt(p2--, '0');str.setCharAt(p2--, '2');str.setCharAt(p2--, '%');--p1;}else{str.setCharAt(p2--, str.charAt(p1--));}}return str.toString();}
}

C++代码:

class Solution {public:void replaceSpace(char *str,int length) {int strlen=0,knum=0,i=0;/*计算空格的数量与字符串的长度*/while(str[i]!='\0'){strlen++;if(str[i]==' ') ++knum;i++;}/* 替换空格后的字符串的长度 */int newlen=strlen+2*knum;/* 如果替换后的长度超过了给出的固定长度则返回 */if(newlen>length)return;int p1=strlen,p2=newlen;while(p1>=0 && p2>p1){if(str[p1]==' '){str[p2--]='0';str[p2--]='2';str[p2--]='%';--p1;}else{str[p2--]=str[p1--];}}}
};

总结

遇到这种字符串替换的问题,如果时间复杂度达到O(n2),则考虑从后往前替换。同时注意要将复制的过程用图示画出来,才不会导致编程出错。

探讨学习加:
qq:1126137994
微信:liu1126137994

【剑指offer - C++/Java】2、替换空格相关推荐

  1. 剑指offer面试题05. 替换空格

    题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 思路 详见链接 在 Python 和 Java 等语言中,字符串都被设计成不可变的类型,即无法直接修改字符串 ...

  2. 剑指offer习题详解——替换空格(全网最全详细解答,多种语言,多种解法)

    题目描述: 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20 ...

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

    https://blog.csdn.net/yanxiaolx/article/details/52235212 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输 ...

  4. 剑指Offer - 面试题5. 替换空格(字符串)

    1. 题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20 ...

  5. 剑指Offer(java答案)

    剑指Offer(java答案) 剑指Offerjava答案 3二维数组中的查找 4替换空格 5从尾到头打印链表 6重建二叉树 7用两个栈实现队列 8旋转数组的最小数字 9斐波那契数列 扩展1跳台阶 扩 ...

  6. 【剑指offer】Java版代码(完整版)

    参考链接 [剑指offer]Java版代码(完整版)

  7. 《剑指Offer》Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈)

    <剑指Offer>Java刷题 NO.36 两个链表的第一个公共结点(链表,等长拼接法,长者先行法,辅助栈) 传送门:<剑指Offer刷题总目录> 时间:2020-06-19 ...

  8. java剑指offer_剑指offer题目java实现

    Problem2:实现Singleton模式 题目描述:设计一个类,我们只能生成该类的一个实例 1 packageProblem2;2 3 public classSingletonClass {4 ...

  9. 剑指offer:java版

    作者:CyC2018 链接:https 文章目录 一.基础 3.数组中的重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到头打印链表 7. 重建二叉树 8. 二叉树的下一个结点 9. 用 ...

  10. 剑指Offer(java实现)

    剑指Offer 数据结构 数组 数组中重复数字 不修改数组寻找重复元素 二维数组中的查找 字符串 替换空格 链表 从尾到头打印链表 树 重建二叉树

最新文章

  1. win32中如何使用CString
  2. 浅谈块级元素和行级元素的相对定位和绝对定位问题
  3. asp.net core监控—引入Prometheus(一)
  4. leetcode 300. 最长上升子序列
  5. python矩阵所有元素取整_Python中如何对一个数值进行取整操作呢?
  6. centos 调整home分区xfs_centos下扩容根分区(针对xfs和ext4不同文件系统)
  7. 石头扫地机器人音量怎么调_石头的新扫地机器人 T6,内外都有升级
  8. 英语 名词复数的变化及其发音
  9. 1到10的英文单词的C语言,1天10个英语专八核心词汇:C开头的单词(11)
  10. Metasploitable2虚拟机镜像下载地址
  11. android手机8g内存够用嘛,手机内存选8G还是12G,行业老人告诉你,多数人都花冤枉钱了...
  12. 百分制转五分制(java)
  13. Aspose.PDF 23.1.0 for .NET Crack
  14. 75%医用输液泵受漏洞威胁 360专家呼吁构建数字安全防御体系
  15. deepfakes怎么用_手把手教你使用 Deepfakes 换脸
  16. envi读取格式ang 还是mtl_ENVI学习笔记一 软件入门
  17. honor 5c recovery nem-tl00h-recovery-twrp3.3.1-0.img
  18. Unity 使用NavMesh实现简易的摇杆功能
  19. 自动化测试—业务线仿真回归流程剖析
  20. ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)

热门文章

  1. 搜索和在线阅读 Github 代码的插件推荐
  2. 泛型参数怎么new_泛型编程,你不知道?(基础篇)
  3. 大型网络架构变迁和知识图谱
  4. SQLServer数据库,表内存,实例名分析SQL语句
  5. 分布式技术一周技术动态 2016.07.10
  6. LeetCode 292 Nim Game
  7. 移动端阻止body左右偏移
  8. 认识 react 的钩子函数
  9. 15-Flutter移动电商实战-商品推荐区域制作
  10. prettier 配置参数说明