题目:请实现一个函数,把字符串中的每个空格替换成"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----替换空格的更多相关文章

  1. 【剑指offer】面试题 5. 替换空格

    面试题 5. 替换空格 题目:请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy. 则经过替换之后的字符串为We%20Are%20Hap ...

  2. 《剑指offer》面试题4 替换空格 Java版

    (给一个足够长的字符数组,其中有一段字符,将' '(空格)替换成'%' '2' '0'三个字符,原字符段由'\0'结尾) 书中方法:这道题如果从头到尾扫描数组并替换,会涉及到数组的移动.如果不移动元素 ...

  3. 【剑指Offer】面试题05.替换空格

    题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20are ...

  4. 《剑指offer》面试题05. 替换空格

    问题描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20a ...

  5. 剑指offer编程题Java实现——替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...

  6. 剑指offer笔记面试题2----实现Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...

  7. 剑指offer笔记面试题1----赋值运算符函数

    题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyS ...

  8. 剑指offer笔记面试题3----数组中重复的数字

    题目一:找出数组中重复的数字.在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如 ...

  9. 剑指offer笔记面试题4----二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含 ...

随机推荐

  1. docker镜像、docker容器导入导出命令

    一.docker镜像导入导出命令 导出命令: docker save -o <保存路径> <镜像名称:标签> docker save -o ./test.tar test:la ...

  2. shell 文本单词计数

    words.txt中的内容如下: the day is sunny the the the sunny is is 统计每个单词出现的次数,并降序输出. Unix Pipes脚本如下: cat wor ...

  3. react-native-linear-gradient颜色渐变

    目录 一 安装 二 使用 2.1 colors 2.2 start / end eg1:斜角渐变 eg2: 从左到右 2.2 locations eg1: 0.4是渐变的起点,0.6是渐变的终点 一 ...

  4. 用JS实现HTML转PDF

    遇到这个需求,现把实现代码整理出来,方便大家参考 <!-- html转PDF --> <script src="https://cdnjs.cloudflare.com/a ...

  5. Vue - watch高阶用法

    1. 不依赖新旧值的watch 很多时候,我们监听一个属性,不会使用到改变前后的值,只是为了执行一些方法,这时可以使用字符串代替 data:{ name:'Joe' }, watch:{ name:' ...

  6. 曹工说Spring Boot源码系列开讲了(1)-- Bean Definition到底是什么,附spring思维导图分享

    写在前面的话&&About me 网上写spring的文章多如牛毛,为什么还要写呢,因为,很简单,那是人家写的:网上都鼓励你不要造轮子,为什么你还要造呢,因为,那不是你造的. 我不是要 ...

  7. ceph 网络配置

    ceph 网络配置 9. 分离 public network 和 cluster network 9.1 分离的好处 (1)提高性能:消除副本创建.数据恢复和再平衡对 public network 的 ...

  8. ARTS-S ansible-playbook

    文件a.yml --- - hosts: cluster remote_user: ksotest gather_facts: false tasks: - name: delete dir if e ...

  9. 【Vuejs】301- Vue 3.0前的 TypeScript 最佳入门实践

    前言 我个人对更严格类型限制没有积极的看法,毕竟各类转类型的骚写法写习惯了. 然鹅最近的一个项目中,是 TypeScript+ Vue,毛计喇,学之...-真香! 1. 使用官方脚手架构建 npm i ...

  10. Python的re模块,正则表达式书写方法

    Python的re模块,正则表达式 #导入re模块 import  re 1.match方法的使用: result = re.match(正则表达式,待匹配的字符串) 正则表达式写法: 第一部分: 字 ...