剑指offer笔记面试题5----替换空格
题目:请实现一个函数,把字符串中的每个空格替换成"20%"。例如,输入“We are happy.”则输出"We%20are%20happy."。
注意:看到这个题目,我们首先应该想到的是原来一个空格字符,替换之后变成'%'、'2'和'0'这3个字符,因此字符串会边长。如果是在原来的字符串上进行替换,就有可能覆盖修改在该字符串后面的内存。如果是创建新的字符串并在新的字符串上进行替换,那么我们可以自己分配足够多的内存。由于有两种不同的解决方案,我们应该向面试官问清楚,让他明确告诉我们他的需求。假设面试官让我们在原来的字符串上进行替换,并且保证输入的字符串后面有足够多的空余内存。
测试用例:
- 输入的字符串中包含空格(空格位于字符串的最前面;空格位于字符串的最后面;空格位于字符串的中间;字符串中有连续多个空格)。
- 输入的字符串中没有空格。
- 特殊输入测试(字符串是一个nullptr指针;字符串是一个空字符串;字符串只有一个空格字符;字符串中有连续多个空格)。
测试代码:
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) == 0){
printf("passed.\n");
}
else{
printf("failed.\n");
}
}
//空格在句子中间
void test1(){
const int length = 100;
char str[length] = "hello world";
test("test1", str, length, "hello%20world");
}
//空格在句子开头
void test2(){
const int length = 100;
char str[length] = " helloworld";
test("test2", str, length, "%20helloworld");
}
//空格在句子末尾
void test3(){
const int length = 100;
char str[length] = "helloworld ";
test("test3", str, length, "helloworld%20");
}
//连续有两个空格
void test4(){
const int length = 100;
char str[length] = "hello world";
test("test4", str, length, "hello%20%20world");
}
//传入nullptr
void test5(){
test("test5", nullptr, 0, nullptr);
}
//传入内容为空字符串
void test6(){
const int length = 100;
char str[length] = "";
test("test6", str, length, "");
}
//传入内容为一个空格的字符串
void test7(){
const int length = 100;
char str[length] = " ";
test("test7", str, length, "%20");
}
//传入的字符串没有空格
void test8(){
const int length = 100;
char str[length] = "helloworld";
test("test8", str, length, "helloworld");
}
//传入的字符串全是空格
void test9(){
const int length = 100;
char str[length] = " ";
test("test9", str, length, "%20%20%20");
}
本题考点:
- 考查应聘者对字符串的编程能力。
- 考查应聘者分析时间效率的能力。我们要能清晰地分析出两种不同方法的时间效率各是多少。
- 考查应聘者对内存覆盖是否有高度的警惕。在分析得知字符串会变长之后,我们能够意识到潜在的问题,并主动和面试官沟通以寻找问题的解决方案。
- 考查应聘者的思维能力。在从前到后替换的思路被面试官否定之后,我们能够迅速先到从后往前替换的方法,这是解决此题的关键。
实现代码:
#include <cstdio>
#include <cstring>
//length为字符数组str的总容量,大于或等于字符串str的实际长度
void replaceBlank(char str[], int length){
if(str == nullptr && length <= 0){
return;
}
//originalLength为字符串str的实际长度
int originalLength = 0;
int numberOfBlank = 0;
int i = 0;
while(str[i] != '\0'){
originalLength++;
if(str[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(str[indexOfOriginal] == ' '){
str[indexOfNew--] = '0';
str[indexOfNew--] = '2';
str[indexOfNew--] = '%';
}
else{
str[indexOfNew--] = str[indexOfOriginal];
}
--indexOfOriginal;
}
}
int main(){
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
return 0;
}
剑指offer笔记面试题5----替换空格的更多相关文章
- 【剑指offer】面试题 5. 替换空格
面试题 5. 替换空格 题目:请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy. 则经过替换之后的字符串为We%20Are%20Hap ...
- 《剑指offer》面试题4 替换空格 Java版
(给一个足够长的字符数组,其中有一段字符,将' '(空格)替换成'%' '2' '0'三个字符,原字符段由'\0'结尾) 书中方法:这道题如果从头到尾扫描数组并替换,会涉及到数组的移动.如果不移动元素 ...
- 【剑指Offer】面试题05.替换空格
题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20are ...
- 《剑指offer》面试题05. 替换空格
问题描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20a ...
- 剑指offer编程题Java实现——替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...
- 剑指offer笔记面试题2----实现Singleton模式
题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...
- 剑指offer笔记面试题1----赋值运算符函数
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyS ...
- 剑指offer笔记面试题3----数组中重复的数字
题目一:找出数组中重复的数字.在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...
- 剑指offer笔记面试题4----二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含 ...
随机推荐
- MongoDB 谨防索引seek的效率问题【华为云技术分享】
目录 背景 初步分析 索引seeks的原因 优化思路 小结 声明:本文同步发表于 MongoDB 中文社区,传送门:http://www.mongoing.com/archives/27310 背景 ...
- 关于简单的Excel多页签底层导出_电子底账导出为例(.net core)
[HttpPost] public ActionResult ExpEleAcc(string linknos) { string filenname = null; CommonResult< ...
- 洛谷 题解 P3173 【[HAOI2009]巧克力】
本蒟蒻又双叒叕被爆踩辣! 又是一道经典的贪心题: 那么怎样切割该块巧克力,花费的代价最少呢? Solution: 窝们考虑每个状态,有多少种选择方法? 是不是可以选择横着切或者竖着切,就这两种方法吧: ...
- 使用Carthage集成Alamofire
Carthage相较于Cocoapods有着使用灵活,对目标工程改动小的优势,使得它越来越受欢迎.今天就对我使用Carthage集成FBSDK做一个记录. 1.首先https://github.com ...
- linux mysql,tomcat与java的安装
先将服务器的安全组设置为 把所有端口或者所需要的端口开放 然后测试远程访问 ssh 用户@ip 登录 输入密码 service iptables stop ...
- Orleans[NET Core 3.1] 学习笔记(三)( 1 )本地开发配置
本地开发配置 本地开发和调试的时候,我们可能不需要去关注集群和网络ip端口.所以对于本地开发模式,Orleans给了我们比较简单的配置方式. Silo配置 在本地开发的配置模式下,Orleans会默认 ...
- 01-使用pipenv管理项目环境
一.使用pipenv管理项目环境 首先为什么我们不在真实环境下做开发呢?真实环境的一些包被其他服务所依赖,我们安装的包和模块都混杂在一起,这样不便于项目管理,还有可能出现意想不到的错误,于是就出现了包 ...
- wxxcx_learn异常处理
属于基础框架,分级别 捕获异常,处理异常(记录日志,修复异常,返回客户端错误),抛出异常 全局异常处理(AOP)对错误同一格式化 try{ $banner = BannerModel::getBann ...
- Spring Boot (二) 整合 Redis
前言 本文将会基于 springboot 2.1.8.RELEASE 简单整合 Redis ,适合新手小白入门 Spring Boot 整合 Redis 入门 1.pom.xml 中引入 redis ...
- 2019年Java并发精选面试题,哪些你还不会?(含答案和思维导图)
Java 并发编程 1.并发编程三要素? 2.实现可见性的方法有哪些? 3.多线程的价值? 4.创建线程的有哪些方式? 5.创建线程的三种方式的对比? 6.线程的状态流转图 7.Java 线程具有五中 ...