【鼠鼠优选算法-双指针】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

【C语言】排序算法——希尔排序以及插入排序 ——详解!!!

【C语言】排序算法——希尔排序以及插入排序 ——详解!!!

【C语言】排序算法——希尔排序以及插入排序详解 * 前言 * 一 、插入排序 * 1. 视频演示 * 2. 算法思想 * 3. 实现思路 * 4. 代码演示 * 二 、希尔排序 * 1. 视频演示 * 2. 算法思想 * 3. 实现思路 * (1)分组 * (2)预排序 * (3)最终排序 * (4)gap的取值 * 4. 代码演示 * 结语 前言 在学习循环的时候,我们学习到了冒泡排序这个算法 那么,除了冒泡排序,还有什么排序算法呢? 今天给大家带来的是插入排序以及希尔排序 一 、插入排序 1. 视频演示 首先给大家看一段视频,让大家先看看插入排序是怎么运行的 插入排序演示 2. 算法思想 我们可以从视频里看见,

By Ne0inhk
C语言指针与数组的深度关联及实战应用

C语言指针与数组的深度关联及实战应用

C语言指针与数组的深度关联及实战应用 💡 学习目标:掌握指针与数组的内在联系,熟练运用指针操作数组元素,解决实际开发中的数组遍历、数据交换等问题;学习重点:数组名的本质、指针算术运算操作数组、指针数组与数组指针的区别及应用。 38.1 数组名与指针的关系 在C语言中,数组和指针有着密不可分的联系。很多初学者会混淆数组名和指针变量的概念,其实二者既有关联,又有本质区别。 38.1.1 数组名的本质 💡 数组名在大多数情况下会被编译器隐式转换为指向数组首元素的常量指针。 我们来看一段简单的代码: #include<stdio.h>intmain(){int arr[5]={10,20,30,40,50};printf("数组首元素地址:%p\n", arr);printf("数组首元素地址:%p\n&

By Ne0inhk
【算法通关指南:算法基础篇】二维差分专题:1.【模板】差分 2.地毯

【算法通关指南:算法基础篇】二维差分专题:1.【模板】差分 2.地毯

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、二维差分 * 二、二维差分经典算法题 * 2.1【模板】差分 * 2.1.1题目 * 2.1.2 算法原理 * 2.2.3代码 * 2.2 地毯 * 2.2.1题目 * 2.2.2 算法原理 * 2.2.3代码 * 总结与每日励志 前言 本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》

By Ne0inhk
【动态规划:01背包】01背包详解 && 模板题 && 优化

【动态规划:01背包】01背包详解 && 模板题 && 优化

文章目录 * 背包问题概述 * 01 背包(medium) * 1、第一问解题思路 * 状态表示 * 状态转移方程 * 初始化 * 遍历顺序 * 返回值 * 2、第二问解题思路 * 状态表示修改 * 状态转移方程细节修改 * 初始化修改 * 代码 * 💥优化 * 优化后的代码 背包问题概述 终于到了动态规划的一类很有名的问题,背包问题了!为什么背包问题让人听起来就怕呢,因为它是基于动态规划的,本身动态规划就是千变万化,再加上背包问题的一些限定条件,使得背包问题也是分为很多类不同的问题,如 01背包、完全背包等等。 背包问题 (Knapsack problem) 其实也是⼀种组合优化的 NP完全问题。其问题可以描述为:给定⼀组物品,每种物品都有⾃⼰的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最⾼。 根据物品的个数,分为如下几类: 01 背包问题:每个物品只有一个完全背包问题:

By Ne0inhk