【剑指offer】学习计划day3

news2024/9/28 1:04:12

 ​​​​​​​

目录

一. 前言 

二.替换空格

        a.题目

        b.题解分析

        c.AC代码

三. 左旋转字符串

        a.题目

        b.题解分析

        c.AC代码 


一. 前言 

 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下链接:

剑指offer-学习计划https://leetcode.cn/study-plan/lcof/?progress=x56gvoct

    本期是本系列的day3,今天的主题是----》字符串(简单)

    题目编号:JZ05,JZ58

二.替换空格

        a.题目

         b.题解分析

        由于针对不同语言,字符串被设计成可变不可变两种,因此我们需要进行分类讨论 

        情景1字符串不可变

        假如我们使用的是C语言,题目传入的是一个字符串常量,是不可变的,即无法直接修改字符串的某一位字符。因此我们需要额外新建一个足够大的字符数组,然后遍历1次原字符串对字符数组进行填充即可。时间复杂度为O(N),空间复杂度也为O(N)。

        情景2字符串可变

        而假如我们使用了C++,题目传入的是一个string类型的变量,是可变的。当然你依旧可以使用一个足够大的辅助空间解决本题。但如果你想把这道题目做到极致,就要充分利用string可变的特性,对字符串进行原地修改

        第一步:显然我们需要扩充字符串到每个空格替换成"%20"之后的大小。

        第二步:使用双指针法,一个指针从后往前遍历原字符串,一个指针从后往前填充新字符串。在这个过程中,如果遇到空格,则将其替换为"%20"。过程如下:

        额外补充:时间复杂度为O(N),空间复杂度为O(1)。可能有小伙伴会有疑问:为什么要从后往前遍历,从前往后不行吗?答案显然是可以的,但是从前往后遍历替换空格时无可避免的要将后面的所有字符进行向后移动,移动字符需要O(N)的时间,整个过程的时间复杂度就为O\left ( N^{2} \right ),时间开销较大。一般很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。


          c.AC代码

//字符串不可变,采用额外空间
char* replaceSpace(char* s) 
{
	char* cur = s;
	int spaceNum = 0;
	//遍历字符串记录有多少空格
	while (*cur)
	{
		if (*cur == ' ')
		{
			spaceNum++;
		}
		cur++;
	}
	cur = s;
	//分配合适的空间,这里求原字符串大小不能用sizeof(),s是指针
	char* ret= (char*)malloc(strlen(s)+1 + spaceNum * 2);
	int retSize = 0;
	//遍历字符串对数组进行赋值
	while (*cur)
	{
		if (*cur == ' ')
		{
            //替换空格
			strcpy(ret + retSize, "%20");
			retSize += 3;
		}
		else
		{
			ret[retSize] = *cur;
			retSize++;
		}
		cur++; //指向下一字符
	}
	ret[retSize] = '\0'; //不要忘记添加字符串结束标志
	return ret;
}
//字符串可变,双指针法

class Solution {
public:
	string replaceSpace(string s)
	{
		int spaceNum = 0; // 统计空格的个数
		int pOld = s.size() - 1; //原字符串最后一个元素下标
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] == ' ')
			{
				spaceNum++;
			}
		}
		s.resize(s.size() + spaceNum * 2); //扩容
		int pNew = s.size() - 1; //新字符串最后一个元素下标
		//双指针进行赋值,遇到空格进行替换
		while (pOld > pNew) //当pOld = pNew时说明前面已经没有空格了
		{
			if (s[pOld] != ' ')
			{
				s[pNew] = s[pOld];
			}
			else
			{
				s[pNew--] = '0';
				s[pNew--] = '2';
				s[pNew] = '%';
			}
			pNew--;
			pOld--;
		}
		return s;
	}
};

三. 左旋转字符串

         a.题目

        b.题解分析

       法1. 辅助空间法

       第一种方法最简单明了:首先建立一个辅助字符数组,然后遍历字符串,将前n个字符放入数组的后n个位置,剩下的字符放入数组前端即可。时间复杂度为O(N),空间复杂度为O(N)

       法2. 三步翻转法 

       此方法非常巧妙,思路如下:先翻转前n个字符,再翻转剩下的字符,最后翻转整个字符串。通过这三次翻转,我们便可以完成左旋n个字符的目的。具体过程如下:

        但是由于涉及到字符串的修改,因此像C语言这些字符串不可修改的语言还是要建立辅助空间,时间复杂度为O(N),空间复杂度为O(N);而像C++这些语言就没有这种顾虑,直接原地修改即可,时间复杂度为O(N),空间复杂度为O(1)

        c.AC代码 

//辅助空间的方式
char* reverseLeftWords(char* s, int n) 
{
	//防止输入的n过大,模上字符串的长度。因为长度为n的字符串左旋n个字符相当于没变
	n %= strlen(s);
	int resSize = 0;
	char* res = (char*)malloc(strlen(s) + 1);//申请辅助空间
	//后面的字符放到前面
	for (int i = n; i < strlen(s); i++)
	{
		res[resSize] = s[i];
		resSize++;
	}
	//前面n个字符放到后面
	for (int i = 0; i < n; i++)
	{
		res[resSize] = s[i];
		resSize++;
	}
	res[resSize] = '\0';
	return res;
}
//逆置的方式

//C语言写法
void reverse(char* s, int left, int right) 
{
	assert(s);
    //逆置字符串
	while (left < right)
	{
		char tmp = s[left];
		s[left] = s[right];
		s[right] = tmp;
		left++;
		right--;

	}
}
char* reverseLeftWords(char* s, int n)
{
	//防止输入的n过大,我们模上字符串的长度。因为长度为n的字符串左旋n个字符相当于没变
	n %= strlen(s);
    //申请辅助空间
	char* res = (char*)malloc(strlen(s) + 1);
    //拷贝到新空间
	strcpy(res, s);
    //三步逆置
	reverse(res, 0, n - 1);
	reverse(res, n, strlen(s)-1);
	reverse(res, 0, strlen(s) - 1);
	return res;
}



//C++写法
class Solution {
public:
	string reverseLeftWords(string s, int n) 
	{
		//防止输入的n过大,模上字符串的长度。因为长度为n的字符串左旋n个字符相当于没变
		n %= s.size();
		//逆置前n个字符,reverse函数在algorithm头文件中
		reverse(s.begin(), s.begin() + n);
		//逆置后续字符
		reverse(s.begin() + n, s.end());
		//整体逆置
		reverse(s.begin(), s.end());
		return s;
	}
};

以上,就是本期的全部内容啦🌸

制作不易,能否点个赞再走呢🙏

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程(3): 线程同步

1. 互斥锁的加锁和解锁 1.1 加锁解锁说明 在处理线程同步时&#xff0c;第一种方式就是使用互斥锁。互斥锁只能同时被一个线程使用&#xff0c;锁的所有权只能被一个线程拥有。互斥锁是线程同步最常用的一种方式&#xff0c;通过互斥锁可以锁定一个代码块 &#xff0c;被锁定…

23款奔驰S450 4MATIC更换原厂旋转高音,提升车内氛围感

奔驰加装3D旋转高音&#xff0c;让高音“有型有色”,高端3D环绕立体声音响系统的视觉效果同样令人印象深刻&#xff1a;系统启动时&#xff0c;安装在前车门后视镜三角板中的两个高音头会与同色车内氛围灯一块亮起&#xff0c;同时向外旋出10mm至最佳效果位置&#xff0c;以提高…

docker安装单机版nacos,并把数据保存到MySQL

1.下载镜像(请根据cloud版本选择) docker pull nacos/nacos-server:1.4.12.启动临时镜像并拷贝文件 docker run -p 8848:8848 -p 9848:9848 -p 9849:9849 --name nacos-temp \ -d nacos/nacos-server:1.4.1后面是需要修改的本机路径 docker cp nacos-temp:/home/nacos/logs/…

记录一个heatmap.js在strict模式下的bug

ImageData的data属性只读&#xff0c;无法修改 出问题的在原始代码的490行~528行 var img this.shadowCtx.getImageData(x, y, width, height);var imgData img.data;var len imgData.length;var palette this._palette;for (var i 3; i < len; i 4) {var alpha imgD…

拥有铁粉,怀抱CSDN大家庭

&#x1f451; 个人主页 &#x1f451; &#xff1a;&#x1f61c;&#x1f61c;&#x1f61c;Fish_Vast&#x1f61c;&#x1f61c;&#x1f61c; &#x1f41d; 个人格言 &#x1f41d; &#xff1a;&#x1f9d0;&#x1f9d0;&#x1f9d0;说到做到&#xff0c;言出必行&am…

收藏备用 | 提高效率的建筑工地技巧

随着城市化进程的加速和建筑业的蓬勃发展&#xff0c;建筑工地扬尘和噪声污染成为了日益突出的问题。这些问题不仅对周边环境造成了不良影响&#xff0c;还对居民的生活质量和健康造成了潜在风险。 为了有效管理和监控建筑工地的扬尘和噪声水平&#xff0c;保障周边居民的权益和…

ROS:rqt工具箱

目录 一、概念二、作用三、rqt安装启动3.1安装3.2启动 一、概念 ROS基于 QT 框架&#xff0c;针对机器人开发提供了一系列可视化的工具&#xff0c;这些工具的集合就是rqt 二、作用 方便的实现 ROS 可视化调试&#xff0c;并且在同一窗口中打开多个部件&#xff0c;提高开发…

nginx简单项目部署

后台可以连接idea服务也可以部署到java上这里不展开 nginx官网下载安装 启动命令&#xff1a; start nginx 或者双击nginx.exe 重启命令 &#xff1a;nginx -s reload 修改配置文件 E:\dev\nginx\nginx-1.22.1\conf\nginx #user nobody; worker_processes 1;#error_log lo…

[Unity实战]EnhancedScroller v2.21.4简单使用[开箱可用]

[Unity实战]EnhancedScroller v2.21.4简单使用[开箱可用] EnhancedScroller v2.21.4 简单使用EnhancedScroller是什么?1.处理UI1.1 加入Canvas1.2 Canvas/Scroller --> 空对象1.3 Scroller加入组件 EnhancedScroller1.4 拖拽Scroller1.5 Scroller/GameObject --> 拖拽到…

GPIO8种工作模式

前言&#xff1a; GPIO是单片机通用的输入输出引脚&#xff0c;基本用途可作为开关&#xff0c;常用于控制LED亮灭、蜂鸣器的鸣响、电机的转停&#xff0c;但由于驱动能力不够&#xff0c;常常要与三极管一起使用。其它的高级用途如I/O作为输入引脚&#xff0c;可检测外部的中…

「解决」pip install xxx 解释器错误: 没有那个文件或目录

bash: /home/raywit/anaconda3/envs/xxx/bin/pip: /home/another/anaconda3/envs/xxx/bin/python: 解释器错误: 没有那个文件或目录 上图是当我拷贝别人环境时发现少包&#xff0c;然后继续pip时出现这样的错&#xff0c;根本原因则是使用pip时路径没修改成自己的。&#xff08…

金九银十互联网大厂Java面试1000问,覆盖一线大厂各种面试痛点

不知不觉马上要到金九银十的跳槽黄金月&#xff0c;跳槽结果有人欢喜有人愁&#xff0c;找到好的下家固然可喜&#xff0c;跳槽结果不理想的朋友也不必丧气&#xff0c;只要扎实提升自己的技术&#xff0c;弄明白大厂面试官的出题逻辑&#xff0c;进大厂必是水到渠成。 之前有…

任天堂 Switch 六月销量破纪录,极有可能成为日本市场销量冠军

任天堂于2017年发布的游戏机Switch已进入第六个年头。虽然该游戏机在硬件性能和品控方面受到一些评价不佳&#xff0c;但销售数据表明绝大多数玩家仍然乐意购买Switch游戏机。 根据日本经济新闻报道&#xff0c;今年6月Switch在日本销售了380,000台机器&#xff0c;同比增长68%…

单片机第一季:零基础3

目录 1&#xff0c;第五章 2&#xff0c;第六章 1&#xff0c;第五章 IDE概念&#xff1a; IDE就是集成开发环境&#xff0c;就是一套用来开发的完整的软件系统。 Keil和MDK&#xff1a; (1)本来只能用来开发51单片机&#xff0c;叫Keil&#xff1b; (2)后来ARM公司收购了Ke…

Python学习笔记(二十)————面向对象

&#xff08;1&#xff09;面向对象的好处 在日常中&#xff0c;记录数据时往往使用统一的表格&#xff0c;这样就不会使得数据信息格式混乱&#xff0c;同样在程序中的数据组织中&#xff0c;仅仅通过变量来记录会显得混乱不统一。 在程序中是可以做到和生活中那样&#xff…

探究Vue源码:mustache模板引擎(5) 对比rollup与webpack,在本地搭建webpack环境

好 从本文开始 我们就来手写一下mustache这个库 他是模板引擎的一个祖先 将模板字符串编译成一个dom字符串 就是它的思想&#xff0c;这也是一个具有跨时代意义的思想 这里的话 我们还是搭一个 webpack 的项目环境 这里值得一提的是 mustache 他官方是通过rollup来进行打包的 …

7-3 种钻石

7-3 种钻石 分数 5 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 2019年10月29日&#xff0c;中央电视台专题报道&#xff0c;中国科学院在培育钻石领域&#xff0c;取得科技突破。科学家们用金刚石的籽晶片作为种子&#xff0c;利用甲烷气体在能量作用下形成碳的等离子体…

抖音seo源码/源代码搭建/源代码部署打包-支持二开

1. 抖音seo源码/源代码搭建/源代码部署打包-支持二开 抖音SEO是指通过提高在抖音平台的关键词排名&#xff0c;来获取流量、获取客户的目的。抖音的流量主要分为付费流量、推荐流量和搜索流量&#xff0c;其中搜索流量因为付费太贵、上热门太累而成为另一种进入方式。与传统搜…

一个UE频繁掉网的问题

这个UE频繁掉网的问题&#xff0c;其实蛮low的&#xff0c;熟悉的人&#xff0c;看一个参数值就搞定这个问题了&#xff0c;但是还是做个记录。问题背景是运营商指定UE锁在某个NR小区&#xff0c;在一个区域的弱信号点(RSRP -110dbm左右)进行TPUT测试&#xff0c;但是最后发现U…

4.日志分布式-ELK

文章目录 日志分布式-ELK概念可以添加的其它组件filebeat 结合 logstash 带来好处为什么要使用 ELK缓存和Fluentd完整日志系统基本特征ELK 的工作原理 部署Elasticsearchjdk环境和防火墙配置安装Elasticsearch修改配置文件优化内存参数启动程序并测试效果安装 Elasticsearch-he…