剑指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----二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含 ...
随机推荐
- Java分割面板和选项卡面板的应用
1.分割面板 JSplitPane类的常用构造方法 构造方法 说明 JSplitPane() 创建一个默认的分割面板.默认情况下为在水平方向上分割,重绘方式为只在调整分隔条位置完成时重绘 JSplit ...
- pringBoot-MongoDB 索引冲突分析及解决【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 如何在Android手机上进行自动化测试(上)
版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本节教程,你将了解到以下内容: 如何在脚本代码中.运行脚本时指定手机 如何填写--device Android:/// ...
- mysql数据库命令
删除一个表: drop table if exists 表名; 在表中插入行: Insert into 表名 values(, , ,) 创建表: Create table 表名( Id int(10 ...
- 登录oracle数据库
1.windows (cmd)命令行登录: 下载命令行工具 点击这里进入官网下载,下载其中三个文件 instantclient-basic-windows.x64-19.3.0.0.0dbru.zip ...
- 布隆过滤器的demo
/** * 缓存击穿 * @author * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = ...
- Python3之Django连接mysql数据库
一.mysql服务器 系统版本:CentOS6.8 IP :10.0.0.51 版本 1.授权root远程登录 grant all on *.* to 'root'@'%' identifide by ...
- Ubuntu修改时间
Ubuntu修改时区和更新时间 先查看当前系统时间 date -R 结果时区是:+0000 我需要的是东八区,这儿显示不是,所以需要设置一个时区 运行 tzselect 在这里我们选择亚洲 Asia, ...
- 如何上传项目到github
喜欢的同学可以看一下原文,讲得更加详细哦 原文地址:http://www.cnblogs.com/cxk1995/p/5800196.html 首先你需要一个github账号,所有还没有的话先去注册吧 ...
- 手动SQL注入原理分析与实践
代码仓库 本文所用代码的代码库地址: 点击这里前往Github仓库 了解SQL注入 定义 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞.可以用它来从数 ...