1. 题目描述

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

2. 思路和方法:

2.1 建议使用的方法:

  中心思想:统计字符串中空格的个数,计算扩容字符串后的长度,然后执行复制和替换。我们从后往前开始替换,首先遍历一遍字符串,统计出空格的个数,并由此能够计算出替换之后的字符串的长度。接着再次从后往前遍历字符串,同时设置两个指针P1和P2,P1指向原始字符串末尾,P2指向替换之后的字符串末尾。我们向前移动P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。然后把P1向前移动一格,在P2之前插入字符串“%20”,同时P2向前移动3格。重复此过程,直到所有的空格都已替换完。这种做法的时间复杂度为O(n)。

2.2 不建议的方法:

  简单暴力解法,从头到尾遍历字符串,碰到空格,首先将后面的所有字符串往后移动2个字符,才能空出3个字符位子插入字符“%20”,对于一个长度为n的字符串,对每个空格,需要移动后面O(n)个字符,因此包含n个空格的字符串,总的时间复杂度为O(n*n)。

3. C++实现

#include<iostream>
/*
将字符串中的空格替换成%20
*/
class Solution {
public:
void replaceSpace(char *str, int length) {
if (str == NULL && length <= ){
return;
}
/*original_length为字符串str的实际长度*/
int original_length = ; //原始长度
int number_blank = ; //空格数
int i=;
while (str[i++] != '\0'){ //遍历字符串
++original_length; //长度+1
if (str[i] == ' '){
++number_blank; //遇到空格+1
}
}
/*new_length为把空格替换成'%20'之后的长度*/
int new_length = original_length + * number_blank; int index_original = original_length; //原始字符串末尾索引值
int index_new = new_length; //计算长度后的字符串末尾索引值 /*index_original指针开始向前移动,如果遇到空格,替换成'%20',否则进行复制操作*/
while (index_original >= && index_new > index_original){
if (str[index_original] == ' '){
str[index_new--] = '';
str[index_new--] = '';
str[index_new--] = '%';
}
else{
str[index_new--] = str[index_original];
}
--index_original;
}
}
}; int main(){
Solution a;
char s[] = "hello world! ";
printf("%s\n", s);
a.replaceSpace(s, );
printf("?%s? ", s);
getchar();
return ;
}

参考资料

https://blog.csdn.net/YF_Li123/article/details/70332267

https://blog.csdn.net/yeqiang19910412/article/details/81567403

剑指offer2:C++实现的替换空格(字符中的空格替换为“%20”)的更多相关文章

  1. 剑指offer---2、二叉搜索树的后序遍历序列

    剑指offer---2.二叉搜索树的后序遍历序列 一.总结 一句话总结: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字 ...

  2. 剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)

    剑指Offer - 九度1356 - 孩子们的游戏(圆圈中最后剩下的数)2014-02-05 19:37 题目描述: 每年六一儿童节,JOBDU都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.H ...

  3. 剑指Offer - 九度1384 - 二维数组中的查找

    剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

  4. 剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数)

    剑指Offer(三十一):整数中1出现的次数(从1到n整数中1出现的次数) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https:// ...

  5. Mysql有什么办法批量去掉某个字段字符中的空格

    Mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数.   ...

  6. 剑指Offer-2.替换空格(C++/Java)

    题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析: 题意明确,就是将一个字符 ...

  7. 剑指offer2

    请实现一个函数,将一个字符串中的字符串空格替换成“%20”.例如:“We Are Happy”转化后为“We%20Are%20Happy” 思路:把字符串转化成字符数组,判断这个字符是不是空格,如果是 ...

  8. 《剑指Offer》面试题-二维数组中的查找

    题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...

  9. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

随机推荐

  1. eclipse中不能找到dubbo.xsd

    使用dubbo时遇到问题: org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'htt ...

  2. Mac下Tomcat安装&配置&80默认端口设置

    序言: 在学习Tomcat时, 部署虚拟服务主机时,遇到了无响应的情况.原以为是应为Tomcat默认端口8080在调整至(进行端口转发设置)默认端口80会和Mac自带Apache起冲突.但是也有同学使 ...

  3. Python面试题: 判断IP地址是否合法

    题目: 给出一个字符串, 判断其是否是是合法的IP(IPv4)地址 思路 将字符串按"."分割成4段得到一个列表 逐个判断列表中的字符串是否数字格式并且在0~255之间, 是在新列 ...

  4. Android学习——MediaProvider与Music模块

    一.MediaProvider数据库介绍 1. 关系型数据库 关系模型的物理表示是一个二维表格,由行和列组成. 2. MediaProvider数据库存储位置     /data/data/com.a ...

  5. shell练习1

    题目 把ls -l 的输出按照属主分类,打印每个属住的文件名 ls -l |sed -n '2,$p'| awk ' {hash[$]=hash[$]} END{ for (user in hash) ...

  6. 安装完Pycharm,启动时碰到"failed to load jvm dll"的解决方案

    今天安装完系统,配置pycharm的环境的时候,启动pycharm时,碰到"failed to load jvm dll"的错误, 下面给出其解决方案: 安装Microsoft V ...

  7. Linux 上的Tomcat配置输入域名直接访问项目

    申请的域名备案通过了,域名是在阿里云上面的买的,一块钱,当初买服务器是买着来玩玩的. 既然申请的域名已经备案通过了,也配置了域名解析 ,服务器上也装了Tomcat,部署了web项目,下面来配置下通过域 ...

  8. NSPredicate谓词的用法

    在IOS开发Cocoa框架中提供了一个功能强大的类NSPredicate,下面来讨论一下它的强大之处在哪...NSPredicate继承自NSObject,它有两个派生的子类• NSCompariso ...

  9. mybatis 操作其他数据库的数据表

    配置文件里面配置的数据库只是默认数据库,并不是只能操作默认数据库.(被自己蠢死了,唉) 1. 注解方式 使用BaseMapper方式操作数据表时,在表对应的实体类上的 @table 注解描述表名时加上 ...

  10. CSS 实现对号效果

    实现对号效果,一种思路是利用现成的符号,直接在网上搜索到 √,插入页面.另一种思路是本文要介绍的用 CSS 实现,思路是: 给块级元素设置宽度和高度 设置元素相邻的两个 border 旋转元素 HTM ...