替换空格
来源:互联网 发布:端口数据采集软件 编辑:程序博客网 时间:2024/06/12 01:01
1.问题描述
请实现一个函数,把字符串中的每个空格替换成“%20”,例如输入“we are happy” ,则输出 “we%20are%20happy%20”。(来自《剑指offer》)
2.分析
我们要将字符串中的空格替换成%20,如果我们从前向后替换的话,每次替换空格后都需要将空格之后的所有字符向后移动。每次遇到空格都需要移动空格后面的字符导致时间效率低。
我们可以从后向前替换,先遍历一遍得到空格的数目,然后计算出转换后字符串的长度,设置2个指针一个指向原来字符串的末尾p1,另一个指向转换后字符串末尾p2。然后移动指针p1,逐个复制p1位置上元素到p2位置上的元素。如果遇到空格,那么将p1向前移动一格,p2向前移动3格同时插入%20。
3.代码
void ReplaceBlank(char *str,int length){ int blankOfStr = 0; int originalLength = 0; if (!str || length<0) { return; } int i = 0; while (str[i] != '\0') { if (str[i] == ' ') { blankOfStr++; } i++; originalLength++; } int newLength = originalLength + blankOfStr*2; if (newLength > length) { return; } while (originalLength < newLength && originalLength >= 0 && newLength > 0) { if (str[originalLength] == ' ') { str[newLength--] = '0'; str[newLength--] = '2'; str[newLength--] = '%'; } else { str[newLength--] = str[originalLength]; } originalLength--; } }
关于字符串的一些知识点 c/c++中字符串都以字符 '\0'作为结尾,为了节省内存,c/c++把常量字符串放在单独的一个内存区域。当几个指针赋值给相同的变量时,它们实际上会指向相同的内存地址,但用常量内存初始化数组时,情况却有所不同(不仅c/c++ ,java,c#也是如此)。
另外在c#封装字符串的类型System.String有一个非常特殊的性质,String中的内容是不能改变的,一旦试图改变String的内容,就会产生一个新的实例,如果试图多次改变String的内容,改变之后的值只能通过返回值得到(或者把参数标记为 ref 或者 out),用String做连续多次修改,每次修改都会产生一个临时对象,这样开销太大影响效率(可以使用StringBuilder)。
遇到需要遍历数组时,注意一下从后向前遍历是否更好些。
实际应用:在网络编程中,如果url参数中含有特殊字符,如空格,‘#’等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。
转换规则:是在%后面跟上ASCII码的两位十六进制表示。
- 空格替换
- 替换空格
- 空格替换
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 空格替换
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 替换空格
- 统计学习方法笔记(一)——统计学习的基本概念
- 程序员找不到开发工作的6大原因
- Powershell: try/catch/finally cannot catch non-terminating error
- n个骰子 点数和 概率计算
- VC debug不能设断点
- 替换空格
- 解决evince打开pdf文件遇到的错误及解决方法
- C++多维数组的声明和使用
- inline_depth和inline_recursion编译指令
- oracle数据库不小心删除了表 解决办法。
- C++ 与 C 的规范不同之处
- 使用morn ui 的loadAssets加载多个资源
- iOS 项目 ShareSDK 实现三方登陆 分享
- Gdb调试多进程程序