【鼠鼠优选算法-双指针】001:移动零 & 002:复写零

【鼠鼠优选算法-双指针】001:移动零 & 002:复写零

🎈主页传送门:良木生香

🔥个人专栏:《C语言》 《数据结构-初阶》 

🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离


在学习了这么多基础知识之后,我们就从今天开始操练一下我们的基本技能吧,先来两道简单的题目试试手:

1.移动零:题目链接~~~

2.复写零:复写零

那我们就一题一题来讲讲吧~~~

一、移动零

题目描述:

看到题目,这道题是想让我们将一个数组中的所有0移动到数组的末尾.

题目意思明了,但是我们该怎么操作呢?

在这道题中我们第一个想到的就是重新创建新的数组,将数值不为0的元素移动到新的数组中,但是题目明确要求说了,只能再原地进操作,我们该怎么实现这个操作呢?又不能创建新的数组不急,我有妙招.

原理解析:

在这道题目中,我们可以用两个指针,current和dentist,一个用来遍历整个数组,另一个用来处理当下的数据

当cur遍历到值为0的元素时,就与dest交换,随后两者同时向后移动一步

但是不管cur碰到的元素是否等于0,都会向后移动一步

 

代码实现:

下面是用C语言实现的代码:

void Swap(int*a,int*b){ int temp = 0; temp = *a; *a = *b; *b = temp; } void moveZeroes(int* nums, int numsSize) { int current = 0; int dentist = 0; while(current<=numsSize-1){ if(nums[current]!=0){ Swap(nums+dentist,nums+current); dentist++; } current++; } }

我们将这段代码提交到力扣平台上,看看运行结果:

显然,通过了,那么以上就是这道题的题解了~~~

 

 

 

二、复写零

题目描述:

这道题目的意思是想让我们在对于数组中的0元素复写一遍,也就是把0再写一遍,而且不用管数组后面的元素,可以被覆盖掉.我们可以通过下面的思路进行解题:

原理解析:

在这道题中,我们首先想到的方法就是从前向后把元素都遍历一遍,在碰到0的时候就再往后移动一次写一个0,但是这样我们会发现,在复写的过程中,会把0元素后面的非零元素给覆盖掉,很显然,从前往后这种方法是行不通的,那我们不妨试试从后往前呢.

想要实现从后往前复写,我们就要找出在原数组中会被复写到的最好一个元素,这样才知道我们要性哪里开始复写.这样的话我们的思路就明了了:

1.先找出最后被复写到的元素

2.判断倒数第二个元素是不是0元素,如果是,那就直接将最后两个元素置为0

3.从后向前实现复写操作

详细代码如下:

void duplicateZeros(int* arr, int arrSize) { //第一步:先找出最后一个元素: int cur=0; int dest=-1; while(cur<arrSize){ if(arr[cur]){ dest++; } else{ dest+=2; } if(dest>=arrSize-1) break; cur++; } //现在另外判断边界情况,也就是说,只有倒数第二个是0的这种情况 if(dest==arrSize){ arr[arrSize-1] = 0; cur--; dest-=2; }

现在我们将代码提交到平台上看看结果:

显然是通过的,那么这就是这道题的所有题解啦~~~~~

 

 

文章是自己写的哈,有什么描述不对的、不恰当的地方,恳请大佬指正,看到后会第一时间修改,感谢您的阅读~

Read more

Python异步编程基石:深入理解asyncio核心原理与实战

Python异步编程基石:深入理解asyncio核心原理与实战

摘要 本文深入剖析Python异步编程核心库asyncio的工作原理,从事件循环、协程、Future到Task的完整技术栈。通过真实性能对比数据、企业级案例和5个架构流程图,全面解析async/await底层机制。涵盖异步编程最佳实践、性能优化技巧和故障排查方案,帮助开发者掌握高并发程序设计精髓,提升I/O密集型应用性能数倍。 1 异步编程:为什么它是Python高性能的关键 在我13年的Python开发经验中,异步编程是性能优化的分水岭。记得曾经处理一个需要调用10个外部API的任务,同步版本需要20多秒,而改用异步后仅需2秒——这种10倍性能提升让我彻底认识到异步编程的价值。 1.1 同步 vs 异步:直观对比 想象你在餐厅点餐的场景: * 同步:点完第一个菜后站着等厨师做完,再点第二个菜,效率极低 * 异步:点完所有菜后找座位等待,厨师并行制作,服务员送餐时通知你 这就是异步编程的核心优势:避免不必要的等待,充分利用等待时间执行其他任务。 import time import asyncio # 同步版本:顺序执行,总耗时=各任务耗时之和 def

By Ne0inhk
C++之基于正倒排索引的Boost搜索引擎项目正倒排索引部分代码及详解

C++之基于正倒排索引的Boost搜索引擎项目正倒排索引部分代码及详解

首先我们通过前面的文章知道正倒排索引在搜索引擎项目中是非常重要的,正排索引与倒排索引协同工作,实现我们对内容的搜索。 这边要说明一点,正排索引是把文档内容放到文档ID里面,同时倒排索引根据文档来映射文档ID。搜索引擎在对文档进行处理和索引构建时,会先创建正排索引,然后基于正排索引进一步生成倒排索引。当用户输入查询关键词时,搜索引擎会利用倒排索引快速定位包含该关键词的文档,再结合正排索引等其他信息进行结果展示。 PS:他们两个是提前创建好的,并不是在外面进行搜索的时候临时创建的。 1.正倒排索引的结构 1.1 正排索引 这个是正排索引所需要的,就是文档的一些内容和他的ID。 //这个是正排索引中需要用到的 typedef struct DocInfo{ std::string title;//文档的标题 std::string content;//文档的内容 std::string url;//文档的url int doc_id;//文档的ID }DocInfo1; 1.2 倒排索引 这个是倒排索引所需要的,文档的ID和他对应的关键字还有他的权重。至于下面那个Inver

By Ne0inhk
C++:模板的幻觉 —— 实例化、重定义与隐藏依赖势中

C++:模板的幻觉 —— 实例化、重定义与隐藏依赖势中

一、表象之下:模板真的“生成代码”吗? 很多人第一次学 C++ 模板时,会这样理解: “模板是一种代码生成机制,编译器在编译时会根据不同类型生成不同版本的函数或类。” 乍一看没错,比如: template<typename T> void print(T x) { std::cout << x << std::endl; } int main() { print(42); print("Hello"); } 似乎编译器确实“生成了两份函数”: print<int>(int) 与 print<const

By Ne0inhk
【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

⭐️在这个怀疑的年代,我们依然需要信仰。 个人主页:YYYing. ⭐️Linux/C++进阶系列专栏:【从零开始的linux/c++进阶编程】 系列上期内容:【Linux/C++多线程篇(二) 】同步互斥机制& C++ 11下的多线程 系列下期内容:暂无 目录 引言:程序如何“联网”? 网络编程基本概念 一、字节序 二、IP地址 IP地址的分类 特殊的IP地址 点分十进制 三、端口号 端口号的分类 网络编程基础 一、套接字(socket)的概念 二、基于TCP面向连接的通信方式  📖 bind函数  📖 listen函数  📖 accept函数  📖 recv、send数据收发  📖 close关闭套接字  📖 connect连接函数

By Ne0inhk