《剑指Offer》面试题5-替换空格
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。
应用背景:在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如'#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。
知识长进:
- 为了节省内存,C/C++把常量字符串放到单独的一个内存区域,当几个指针赋值给相同的常量字符串时,他们实际上会指向相同的内存。
- 在合并两个数组(包括字符串)时,如果从前往后复制每个数字则需要重复移动数字多次,那么可以逆向思维,考虑从后往前复制,这样子可以减少移动的次数,从而提高效率,但是要注意内存覆盖问题。
- 在清楚空格中,清除空格后所得到的字符串要比原先的字符串要短,我们从头到尾进行清楚空格的话就不会覆盖到空格后面的字符,所以我们可以从头开始清除,效率反而比较高。
相比源代码的改进点:因为C/C++中每个字符串都以字符‘\0’作为结尾,所以源代码中if(newLength > length)存在溢出风险,修正为if((newLength+1) > length)。
***********************************************************************************
算法实现:如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。
- 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
- 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
- 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
- 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“%20”
- 直到point1==point2时表明字符串中的所有空格都已经替换完毕。
#include<cstdio>
#include<cstring> /*length为字符数组string的总容量*/
void ReplaceBlank(char string[], int length)
{
//特殊输入,鲁棒性
if (string == nullptr || length <= )
return; //计算空格的数量
int i = ;
int originalLength = ;
int numberOfBlank = ;
while (string[i]!='\0') //字符串结尾
{
if (string[i] == ' ')
numberOfBlank++;
originalLength++;
++i;
}
/*newLength为把空格替换成'%20'之后的长度*/
int newLength = originalLength + * numberOfBlank;
//鲁棒性,自己未考虑到,考虑最后字符串的空格
if (newLength > (length-))
return; int indexOfOriginal = originalLength;
int indexOfNew = newLength;
while (indexOfNew>indexOfOriginal && indexOfOriginal>=)
{
if (string[indexOfOriginal] == ' ')
{
//空格,新字符串替换为‘%20’
string[indexOfNew--] = '';
string[indexOfNew--] = '';
string[indexOfNew--] = '%';
indexOfOriginal--;
}
else
{
string[indexOfNew--] = string[indexOfOriginal--];
}
}
} // ====================测试代码====================
void Test(char* testName, char str[], int length, char expected[])
{
if (testName != nullptr)
printf("%s begins: ", testName); ReplaceBlank(str, length); if (expected == nullptr && str == nullptr)
printf("passed.\n");
else if (expected == nullptr && str != nullptr)
printf("failed.\n");
else if (strcmp(str, expected) == )
//字符串相等
printf("passed.\n");
else
printf("failed.\n");
} // 空格在句子中间
void Test1()
{
const int length = ; char str[length] = "hello world";
Test("Test1", str, length, "hello%20world");
} // 空格在句子开头
void Test2()
{
const int length = ; char str[length] = " helloworld";
Test("Test2", str, length, "%20helloworld");
} // 空格在句子末尾
void Test3()
{
const int length = ; char str[length] = "helloworld ";
Test("Test3", str, length, "helloworld%20");
} // 连续有两个空格
void Test4()
{
const int length = ; char str[length] = "hello world";
Test("Test4", str, length, "hello%20%20world");
} // 传入nullptr
void Test5()
{
Test("Test5", nullptr, , nullptr);
} // 传入内容为空的字符串
void Test6()
{
const int length = ; char str[length] = "";
Test("Test6", str, length, "");
} //传入内容为一个空格的字符串
void Test7()
{
const int length = ; char str[length] = " ";
Test("Test7", str, length, "%20");
} // 传入的字符串没有空格
void Test8()
{
const int length = ; char str[length] = "helloworld";
Test("Test8", str, length, "helloworld");
} // 传入的字符串全是空格
void Test9()
{
const int length = ; char str[length] = " ";
Test("Test9", str, length, "%20%20%20");
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
Test9();
getchar();
return ;
}
《剑指Offer》面试题5-替换空格的更多相关文章
- 剑指offer面试题4 替换空格(java)
注:利用java中stringBuilder,append,length方法很方便的解决字符串问题 /* * 剑指offer 替换空格 * xsf * */ /*开始替换空格的函数,length为原数 ...
- 剑指offer面试题4 替换空格(c)
- 剑指Offer:面试题4——替换空格(java实现)
问题描述:请实现一个函数,把字符串中的每个空格替换成"%20". 例如: 输入:"We are happy." 输出:"We%20are%20happ ...
- C++版 - 剑指offer 面试题4: 替换空格 题解
面试题4:替换空格 提交网址: http://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&tqId=1 ...
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 剑指Offer - 九度1510 - 替换空格
剑指Offer - 九度1510 - 替换空格2013-11-29 20:53 题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之 ...
- 剑指offer第二版-5.替换空格
面试题5:替换空格 题目要求: 实现一个函数,把字符串中的每个空格都替换成“%20”,已知原位置后面有足够的空余位置,要求改替换过程发生在原来的位置上. 思路: 首先遍历字符串求出串中空格的数量,求出 ...
- 剑指offer(2)替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 题目分析 我们如果要替换空格,两步 ...
- 剑指offer【02】- 替换空格(Java)
题目:替换空格 考点:字符串 题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. ...
- 剑指Offer(4)——替换空格
题目: 请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 思路: 如果按照顺序从前往后依 ...
随机推荐
- JAVA课程设计个人博客 学生基本信息管理 201521123117 李心宇
1. 团队课程设计博客链接 http://www.cnblogs.com/ll321/p/7067598.html 2.个人负责模块或任务说明 ①主要有三个界面的设计,包括:登录界面,功能选择界面还有 ...
- 201521123009 《Java程序设计》第12周学习总结
1. 本周学习总结 2. 书面作业 Q1:将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示 ...
- POJ 3190 Stall Reservations (优先队列)C++
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7646 Accepted: 271 ...
- 【机器学习实战】Machine Learning in Action 代码 视频 项目案例
MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apa ...
- Linux配置SSH端口以及密钥登录
改端口后重启: vim /etc/ssh/sshd_config systemctl restart sshd
- Mybatis学习(三)XML配置文件之mybatis-config.xml
1.MyBatis的配置文件结构 1.1 properties 这些是外部化的,可替代的属性,这些属性也可以配置在典型的 Java 属性配置文件中,或者通过 properties 元素的子元素来传递. ...
- JavaScript中DOM
概念 什么是DOM 1. 什么是 DOM DOM 的全称是document object model 它的基本思想是将结构化文佳例如HTML xml解析成一系列的节点.就像一颗树一样. 所有的节点和最 ...
- python实现算24的算法
1.介绍 给定4个整数,数字范围在1-13之间,任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24的游戏.本文介绍用Python语言实现的两种方式.2.实现思 ...
- Zabbix 添加脚本检测IP变化
监控环境 IP和HOSTNAME 有时会有变化.但目前是通过IP地址监控,不是DNS名,添加一个外部脚本,发现IP和HOSTNAME发生变化时告警. vim /usr/local/etc/zabbix ...
- node.js express mvc轻量级框架实践
本文记录的是笔者最近抽私下时间给朋友做的一个时时彩自动下注系统,比较简单,主要也是为了学习一下node.js. 其实逻辑没什么可以深谈的,主要是想说说这套代码结构.结构如下图: js的代码比较难以维护 ...