剑指offer-替换空格

替换空格

        • 一、解题思想
        • 二、代码的实现
        • 三、总结

一、解题思想

题目:请实现一个函数 ,把字符串中的每个空格替换成”%20“。例如:输入”We are happy.“,则输出”We%20are%20happy.“。

看到这个题目,我第一想到的是,把字符串遍历一遍,每遇到一个空格就把空格替换成”%20“,由于是把一个字符替换成3个字符,所以我们必须把后面所有的字符都向后移动2个字符位置,否则就有两个字符背覆盖掉。
但是这样的做法,会使得时间复杂度为O(N^2),我们还有没有更优的方法来解答这个题呢,答案是有的。

我们把字符串先遍历一遍,把字符串的个数(包含空格)和空格的个数保存下来;由此我们可以计算出替换之后字符串总大小了,字符串个数+空格个数*2;然后我们定义两个指针,p1 和 p2,p1用来指向原始字符串的末尾,p2用来指向替换后字符串总数量的末尾,接下来我们移动p1,逐个把它指向的字符复制到p2所指向的位置,知道遇到第一个空格为止。当遇到第一个空格时 ,把p1向前移动一个位置,在p2前插入”%20“,%20的长度是3,所有p2也要向前移动3个位置。当p1和p2指向同一个位置时,说明字符串中的空格已经被全部替换完成。
如图所示:
在这里插入图片描述

这个算法所有的字符都只需要移动一次,所以这个时间复杂度是O(N);

二、代码的实现

void ReplaceBlank(char str[], int length)
{
	
	if (str == NULL || length <= 0)
		return;

	//originalLength 总字符长度,不包含\0
	int originalLength = 0;
	//numberOfBlank 空格个数
	int numberOfBlank = 0;
	int i = 0;
	while (str[i] != '\0')
	{
		++originalLength;

		if (str[i] == ' ')
			++numberOfBlank;
		++i;
	}
	//printf("%d\n", originalLength); //13
	//printf("%d\n", numberOfBlank); //2

	//newLength 加上修改后的字符串的总长度 :17
	int newLength = originalLength + (numberOfBlank * 2);
	//如果newLength大于总容量大小则退出
	if (newLength > length)
		return;

	int indexOfOriginal = originalLength;
	int indexOfNew = newLength;
	//循环条件
	while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
	{
		//原尾下标位置为0时,让新尾下标--,同时给字符,
		if (str[indexOfOriginal] == ' ')
		{
			str[indexOfNew--] = '0';
			str[indexOfNew--] = '2';
			str[indexOfNew--] = '%';
		}
		//否则就把原尾下标--,把值给新尾
		else
		{
			str[indexOfNew--] = str[indexOfOriginal];
		}
		//indexOfOriginal原尾下标--要放在这,因为不管是为空还是赋值都需要indexOfOriginal--
		--indexOfOriginal;
	}
}


int main()
{
	char str[30] ="We are  happy.";
	int length = sizeof(str) / sizeof(str[0]);
	ReplaceBlank(str, length);
	printf("%s", str);
	return 0;
}

三、总结

整个题目的思路:

1.计算字符串的长度和字符串中空格的长度;

2.计算出被替换后字符串的长度:字符串长度+空格长度*2

3.使用两个指针p1和p2,p1指向原始字符串末尾,p2指向被替换后的字符串的末尾,如果字符串中的字符是空格则在p2之前插入”%20“,如果p1指向的字符不是空格,则把p1的字符拷贝到p2;直到p1指向的位置等于p2指向的位置,此时说明字符串中空格已经被全部替换了,循环结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6658.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博客1:YOLOv5车牌识别实战教程:引言与准备工作

摘要:本篇博客介绍了本教程的目标、适用人群、YOLOv5简介和车牌识别的意义和应用场景。为后续章节打下基础,帮助读者了解YOLOv5和车牌识别的相关背景知识。 正文: 车牌识别视频 引言 欢迎来到YOLOv5车牌识别实战教程!在这个教程中,我们将一步步教你如何使用YOLOv5进行车…

【Git Bash】项目开发过程中需要知道 git stash 的用法

目录1. git stash的应用场景2. 常用git stash命令2.1 git stash2.2 git stash save "message"2.3 git stash list2.4 git stash show2.5 git stash show -p2.6 git stash apply2.7 git stash pop2.8 git stash drop stash{num}2.9 git stash clear3. stash只会保存已…

简单记录一下软著申请流程

模板我就不放了&#xff0c;网上很多&#xff0c;随便下几个结合就行了 总体来说&#xff0c;我是2023.2.19号寄出&#xff0c;2023.4.6看到成功了&#xff0c;总共50天左右。 大家确实不需要网上买那种服务&#xff0c;我也是第一次申请&#xff0c;感觉还是挺简单的。只要按…

洛谷B2038奇偶ASCII值判断

洛谷B2038 题目描述 任意输入一个字符&#xff0c;判断其 ASCII 是否是奇数&#xff0c;若是&#xff0c;输出 YES&#xff0c;否则&#xff0c;输出 NO 。 例如&#xff0c;字符 A 的 ASCII 值是 65&#xff0c;则输出 YES&#xff0c;若输入字符 B(ASCII 值是 66)&#xff0…

从零开始学习Kotlin,带你快速掌握该编程语言

前言 Kotlin是一种跨平台的静态编程语言&#xff0c;它可以在JVM、Android、浏览器、iOS等多个平台上运行。Kotlin的语法简洁易懂&#xff0c;具有高度的可读性和可维护性&#xff0c;同时还具有Java所不具备的许多优点。 Kotlin是一种静态类型、面向对象、函数式编程语言&am…

iOS 项目嵌入Flutter 运行

一 创建Flutter 模块命令行flutter create --template module my_flutter创建完成后&#xff0c;该模块和普通的Flutter项目一直&#xff0c;可以通过Android Studio或VSCode打开、开发、运行&#xff1b;和之前项目不同的iOS和Android项目是一个隐藏文件&#xff0c;并且我们…

多模态 |COGMEN: COntextualized GNN based Multimodal Emotion recognitioN论文详解

论文&#xff1a;COGMEN: COntextualized GNN based Multimodal Emotion recognitioN COGMEN: 基于GNN的多模态情感识别技术 论文实现可参考另外一篇论文&#xff1a; 本文主要分为俩部分&#xff0c;一是对论文的简单概括&#xff0c;二是对论文的翻译。 论文总结 论文翻译…

【学习笔记】SpringAOP的用法全解

文章目录Spring的AOP一、 Spring对AOP的实现包括以下3种方式**什么是AspectJ?**二、使用Spring的AOP1、准备工作2、尝试写一个简单的AOP demo3、代码如下&#xff1a;spring.xml业务类切面类测试类4、复习切面表达式1&#xff09;所有方法2&#xff09;指定路径下某个包及其子…

开心档之C++ 运算符

目录 C 运算符 算术运算符 实例 实例 关系运算符 实例 实例 逻辑运算符 实例 实例 位运算符 实例 实例 赋值运算符 实例 实例 杂项运算符 C 中的运算符优先级 实例 实例 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&…

算法设计-二分

一、有序和单调 ​ 二分本质上是一种更加智能的搜索状态空间的方式&#xff0c;他需要状态空间的状态呈现一种“有序的一维数组”的形式&#xff0c;然后再进行搜索。所以一开始的排序是无法避免的。 ​ 因为二分的写法问题&#xff0c;所以应当怎样排序也是有一定讲究的&…

黑马程序员 linux 学习笔记入门部分合集

ubuntu 安装 本课程使用 ubuntu 系统。 ubuntu 官网 - download。 上面会显示有两个版本&#xff0c;每年 ubuntu 发布两个版本&#xff0c;LTS 是长期维护版&#xff0c;所以相对会较稳定。 介绍 Linux 发行版本 不管什么版本&#xff0c;内核都是一样的。 RPM based&a…

“遥感+”蓝碳储量估算、红树林信息提取与论文写作

详情点击链接&#xff1a;“遥感”蓝碳储量估算、红树林信息提取与论文 一&#xff0c;光谱遥感数据及预处理 .1高光谱遥感数据 高光谱分辨率遥感是用很窄而连续的光谱通道对地物持续遥感成像的技术。在可见光到短波红外波段其光谱分辨率高达纳米数量级。高光谱图像数据…

Linux-Vim

一、Vim 配置 ​ vim界面打开以后很丑就不提了&#xff0c;关键有很多基本功能没有办法实现&#xff0c;所以需要自己配置&#xff0c;如果是linux系统&#xff0c;那么应该找到 /usr/share/vim/.vimrc​ 如果是windows装完git以后会自动一个vim&#xff0c;此时应该找到 Gi…

电子招标采购系统—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff…

vue + table原生实现表格单元列列宽可重置

const tableMixin {data() {return {dragState: {}, // 记录子表的列宽移动的一些数值dragging: false // 子表是否在重置列宽}},methods: {handleMouseMove(event) {let target event.targetwhile (target && target.tagName ! TH) {target target.parentNode}if (…

算法竞赛ICPC、CCPC、NIO、蓝桥杯、天梯赛

算法竞赛前言一、为什么学习算法竞赛二、学习算法的阶段三、算法竞赛具体学习内容1、基础数据结构1.1、链表1.1.1、动态链表1.1.2、静态链表1.1.3、STL list1.2、队列1.2.1、STL queue1.2.2、手写循环队列1.2.3、双端队列和单调队列1.2.4、优先队列1.3、栈1.3.1、STL stack1.3.…

23 - x的平方根,快速幂,超级次方

文章目录1. x的平方根2. 快速幂3. 超级次方1. x的平方根 二分查找 class Solution { public:int mySqrt(int x) {int left 1, right x;while(left < right){int mid left (right - left) / 2;if(mid > x / mid){right mid - 1;}else if(mid < x / mid){left mi…

OpenShift 4 - Red Hat 是如何对容器镜像的安全风险进行评估分级的

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录RedHat 对 CVE 的风险级别的评级通用漏洞评分系统 CVSS红帽严重性分级RedHat 对容器镜像的整体风险的分级云原生应用的运行载体是容器镜像&#xff0c;因此容器镜像的安全便是云原生应用安全的关键因素。为此&#xff0c;Re…

联合解决方案|亚信科技AntDB携手蓝凌软件,助推企业数字化办公转型升级

随着企业数字化转型的深入&#xff0c;企业对于协同办公、移动门户、数字运营、智能客服等方面的需求越来越高&#xff0c;数智化正成为催生新动能和新优势的关键力量。数字化的办公平台可以帮助企业实现各类信息、流程的集中化、数字化和智能化管理&#xff0c;为企业管理者提…

老板,你的绩效管理该升级了!

中小企业的绩效考核&#xff0c;一直是一个备受关注的话题。虽然传统的绩效考核理论已经非常成熟&#xff0c;但是在实际应用中&#xff0c;我们往往会遇到各种各样的问题。因此&#xff0c;在选择绩效考核工具和方法时&#xff0c;我们应该注重实用性&#xff0c;不断探索新的…