面试题4:替换字符串中的空格
2016-06-07 21:04
274 查看
1.题目:实现一个函数,把字符串中的每个空格替换成%20,例如输入:We are happy!, 则被替换成We%20are%20happy!
在网络编程中,URL地址中常包含特殊的字符如空格等,为了便于服务器解析,将这些特殊的字符转换成服务器可以识别的字符。转换规则是在%后面加上ASCII码的两位的十六进制表示,空格的ASCII码为32,十六进制为0x20,则替换的结果就是%20.
分析:假设只是在源字符串上进行替换,并且保证输入的字符串的后面有足够的内存。如果按照常规的解法,从前到后遍历字符串,则每遇到一个空格,都会将字符串后面的部分向后移动两个位置,如果有多个空格的话,将会移动多次。可以考虑从后开始扫描空格的位置,可以只移动一次就将响应的字符移到最终的位置。可以先统计出空格的个数,则新串的长度为原串的长度加上空格的个数*2,然后从后开始扫描字符串,如果不是空格,则从后面一次复制字符,如果碰到空格,则填充响应的%20,并向前移动三个位置。整个过程可以方便的用指针来实现。如下图:
![](http://img.blog.csdn.net/20160607212139041?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
源码:
在网络编程中,URL地址中常包含特殊的字符如空格等,为了便于服务器解析,将这些特殊的字符转换成服务器可以识别的字符。转换规则是在%后面加上ASCII码的两位的十六进制表示,空格的ASCII码为32,十六进制为0x20,则替换的结果就是%20.
分析:假设只是在源字符串上进行替换,并且保证输入的字符串的后面有足够的内存。如果按照常规的解法,从前到后遍历字符串,则每遇到一个空格,都会将字符串后面的部分向后移动两个位置,如果有多个空格的话,将会移动多次。可以考虑从后开始扫描空格的位置,可以只移动一次就将响应的字符移到最终的位置。可以先统计出空格的个数,则新串的长度为原串的长度加上空格的个数*2,然后从后开始扫描字符串,如果不是空格,则从后面一次复制字符,如果碰到空格,则填充响应的%20,并向前移动三个位置。整个过程可以方便的用指针来实现。如下图:
源码:
/*替换字符串中的空格*/ #include <iostream> #include <string> using namespace std; #define MAXLENGTH 100 /*length 为字符数组string的总容量*/ 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] == ' ')//当遇到空格时,填充之后,应该前进3个位置 { string[indexOfNew--] = '0'; string[indexOfNew--] = '2'; string[indexOfNew--] = '%'; } else { string[indexOfNew--] = string[indexOfOriginal]; } --indexOfOriginal; } } int main() { char c[MAXLENGTH] = "We are happy!"; cout << "原字符串为:" << c << endl; ReplaceBlank(c, MAXLENGTH); cout << "替换之后的结果为:" << c << endl; system("PAUSE"); return 0; }
相关文章推荐
- 开一篇文章 记录我的java学习路上看过的书和资料 以及杂七杂八的面试经历
- 程序员面试金典(二)
- 汇编程序员之代码风格指南
- 嵌入式软件工程师 面试经验
- [译]好程序员的五声“呐喊”
- 实习面试小记-腾讯、阿里、大摩、网易
- 链表面试题详解
- 如何在面试中发现优秀程序员(转)
- 剑指Offer----面试题29:数组中出现次数超过一半的数字
- 《黑客与画家》读书笔记
- 应届生如何为工作做准备 程序员 技术大牛
- 转载:一个程序员的顿悟
- 面试题的收集
- 程序员的年龄天花板
- 程序员之路──关于代码风格
- 面试过程中涉及的问题
- 标准的JDBC数据库连接代码(面试)
- 女程序员发的一条微博
- 面试中遇到的挫折与打击
- JAVA面试中的多线程问题