剑指Offer系列---(6)替换空格
2015-09-07 20:30
323 查看
1.题目描述:
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入”We are happy.”则输出”We%20are%20happy.”。
2.分析:
如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。
1)首先遍历原字符串,找出字符串的长度以及其中的空格数量;
2)根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度;
3)设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置;
4)如果point1指向的内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值”%20”,并且第一个指针向前移动一格,第二个指针向前移动三格;
5)直到point1==point2时表明字符串中的所有空格都已经替换完毕。
3.源代码:
拓展:清除空格
分析:
1)设定两个指针p1和p2,初始状态都指向字符串首字符;
2)如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素;
3)直到p2指向字符串末尾的’\0’时清除空格结束。
源代码:
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入”We are happy.”则输出”We%20are%20happy.”。
2.分析:
如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。
1)首先遍历原字符串,找出字符串的长度以及其中的空格数量;
2)根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度;
3)设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置;
4)如果point1指向的内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值”%20”,并且第一个指针向前移动一格,第二个指针向前移动三格;
5)直到point1==point2时表明字符串中的所有空格都已经替换完毕。
3.源代码:
// Copyright (c) 2015年 skewrain. All rights reserved. // #include <iostream> #include <stdio.h> using namespace std; //length为字符串总容量 void ReplaceBlank(char string[],int length) { if (string == NULL || length <= 0) { return; } //originalLength为字符串string的实际长度 int originalLength = 0; int numberOfBlank = 0; int i = 0; while (string[i] != '\0') { ++ originalLength; if (string[i] == ' ') { ++ numberOfBlank; } ++i; } //newLength为把空格替换成'%20'之后的长度 int newLength = originalLength + numberOfBlank*2; if (newLength > length) { return; } int indexOfOriginal = originalLength; int indexOfNew = newLength; while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) { if (string[indexOfOriginal] == ' ') { string[indexOfNew--] = '0'; string[indexOfNew--] = '2'; string[indexOfNew--] = '%'; } else { string[indexOfNew--] = string[indexOfOriginal]; } -- indexOfOriginal; } } int main(int argc,char *argv[]){ char *string = new char[50]; while (gets(string)) { ReplaceBlank(string, 50); puts(string); } return 0; }
拓展:清除空格
分析:
1)设定两个指针p1和p2,初始状态都指向字符串首字符;
2)如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素;
3)直到p2指向字符串末尾的’\0’时清除空格结束。
源代码:
#include <iostream> #include <stdio.h> using namespace std; void RemoveBlank(char *s) { //设置两个指针指向数组首元素 char *p1 = s; char *p2 = s; while ('\0'!=*p1) { if(' '!=*p2)//如果p2指向不为空格,则将p2指向内容复制给p1指向 *p1++ = *p2++; else//如果p2指向为空格,则p2指针向前移动一格。 p2++; } } int main(int argc,char *argv[]){ char string[100] = "we are happy."; cout<<string<<endl; RemoveBlank(string); cout<<string<<endl; return 0; }
相关文章推荐
- javascript 构造函数内return 解析
- [LeedCode OJ]#19 Remove Nth Node From End of List
- JS获取汉字首字母
- JSon
- hadoop配置好之后启服务,jps能看到datanode进程,可是后台的datanode日志有如下错误,且50070端口上也是没有活的节点
- Hello JSP!——<jsp:plugin>、<jsp:params>、<jsp:fallback>动作元素篇
- LeetCode_populating-next-right-pointers-in-each-node
- StringBufferDemo
- javascript写的简单的计算器,附加界面、代码,方法实用
- 省市联查
- 掌握HTML 的表格,表单,列表标签
- web前端:js
- POI-----单元格常用样式
- SharedPreference的简单封装备份
- [转] 前端学习必备基础(1)
- Velocity.js实现动画序列的三种方法
- [RxJS] Aggregating Streams With Reduce And Scan using RxJS
- js对象
- [WEB前端开发]-关于Velocity中Map与List操作-解决velocity无法识别Map对象key的问题
- [RxJS] map vs flatMap