【剑指offer|图解|双指针】移除元素 + 合并两个有序数组
一. ⛳️移除元素
题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。
- 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
- 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
输入: nums = [ 3, 2, 2, 3 ], val = 3
输出: 2, nums = [ 2, 2 ]
说明: 函数应该返回新的长度 2 , 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
限制:
- 0 <= nums.length <= 100
- 0 <= nums[i] <= 50
- 0 <= val <= 100
解题思路:
双指针解法
定义双指针 pre 和 cur 分别位于数组的起始端,使用指针cur遍历数组nums:
- 如果nums[cur] == val,则执行cur自增加1;
- 如果nums[cur] != val,则执行nums[pre++] = nums[cur],并执行cur自增加1。
- 当cur指向数组的末尾时,终止循环,返回pre即可;
c++代码:
int removeElement(int* nums, int numsSize, int val){ //初始化两个指针,分别指向数组初始位置 int pre = 0; int cur = 0; //循环 for(cur = 0; cur < numsSize; cur++) { if(nums[cur] != val) nums[pre++] = nums[cur]; } //返回结果 return pre; }
二. ⛳️合并两个有序数组
题目:
给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。
注意: 最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。
示例:
输入: nums1 = [ 1, 2, 3, 0, 0, 0 ], m = 3, nums2 = [ 2, 5, 6 ], n = 3
输出: [ 1, 2, 2, 3, 5, 6 ]
限制:
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- -109 <= nums1[i], nums2[j] <= 109
解题思路:
双指针
1.初始化: 定义三个指针end1,end,end2分别指向数组num1的有效元素的位置、以及num1和num2的最后位置。
2.循环:
- 如果nums1[end1] > nums2[end2],执行nums1[end--] = nums2[end2--];
- 如果nums1[end1] <= nums2[end2],执行nums1[end--] = nums1[end1--];
- 如果end1 或 end2 其中一个小于0,循环终止。
3.判断end2是否小于零:
- 如果为小于零,不进行任何操作;
- 如果大于等于零,将nums2中的剩余的元素压入nums1中。
c++代码:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ //初始化 int end = m + n -1; int end1 = m -1; int end2 = n - 1; //循环 while(end1 >= 0 && end2 >= 0) { if(nums1[end1] > nums2[end2]) { nums1[end--] = nums1[end1--]; } else { nums1[end--] = nums2[end2--]; } } //判断end2的值 while(end2 >= 0) { nums1[end--] = nums2[end2--]; } }
📝全文总结
本文主要讲解:
本文结合两道题目对顺表的考察方向有的初步了解,主要也是结合其他算法对数组进行相关操作。觉得不过瘾的小伙伴可以去牛客或者leetcode多找写相关题目进行练习,多做多练总会有好处的。
今天的内容就到这里了,你对今天的内容是否有所掌握?如果还有疑问的话请在评论区里多多提问,大家可以一起帮你解决,让我们共同进步。创作不易,如果对你有用的的话点个赞支持下作者,你们的支持是作者创作最大的动力。关注我不迷路,让我们下期再见✋✋。
相关文章:

C语言常见面试题:什么是变量?变量有哪些作用?
变量是编程中的一个基本概念,其定义和用法因编程语言和上下文而异。但通常来说,变量是用于存储数据的容器,这些数据可以是数字、文本、布尔值等。总的来说,变量在编程中扮演着重要的角色,它们使得我们能够有效地存储、操作和使用数据。不同的编程语言和上下文可能会对变量的具体定义和使用方式有所不同,但上述作用是通用的。总的来说,变量和常量都是编程中重要的概念,它们各自有其特定的用途和特性。在编程中正确地使用它们可以帮助我们更好地组织和控制程序的行为。变量和常量在编程中都是重要的概念,但它们之间存在明显的区别。

C程序的内存空间布局(栈、堆、数据区、常量区、代码区)
较详细的介绍了栈、堆、数据区、常量区、代码区

NRF24L01模块传输MPU6050数据,接收端数据一直为0问题记录
问题描述:一、发射端1、正确配置NRF模块,以及测试过能够正常通信,在发射端的发射线程中进行了如下操作2、这里是获取了陀螺仪的x轴数据,将其而分为两个8位的数据存入发送缓冲区中。因为一个陀螺仪x轴数据是16位的,所以对其进行了拆分,这里只获取gyro的x轴数据进行发送,目的是进行测试。3、这个是发送函数,只要把发送缓冲区的地址作为参数传入就可以发送了。二、接收端1、接收端的NRF24L01模块也正确配置后,在接收线程中进行如下操作2、读取NRF传输过来的数据,存到接收BUF中,然后打印

C语言常见面试题:什么是宏,宏的作用是什么?
宏在计算机科学中是一种批量处理程序命令,它是一种抽象的规则或模式,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。在编译时,预处理器会对宏进行展开,即将宏的内容替换到宏所在的位置。以上是宏的一些主要作用,但并不是全部。在实际编程中,根据需要选择是否使用宏以及如何使用宏,以实现更好的代码组织和可读性。,这样就可以计算出a和b的和。这个例子展示了宏的基本用法和作用。在这个例子中,我们定义了一个宏。,用于计算两个数的和。时,预处理器会将其展开为。

Java数据结构与算法:排序算法之冒泡排序
冒泡排序是一种基础的比较排序算法,其核心思想是多次遍历待排序的元素,通过不断交换相邻的元素,使得最大(或最小)的元素逐步移动到正确的位置。虽然它在效率上不如一些高级排序算法,但其实现简单,是学习排序算法的绝佳入门。

C语言中常用的字符串处理函数和内存操作函数
`memmove(void *destination, const void *source, size_t num)`:将`source`指向的内存块的前`num`个字节移动到`destination`所指向的内存块,即使内存块有重叠部分。返回指向`destination`的指针。- `memcpy(void *destination, const void *source, size_t num)`:将`source`指向的内存块的前`num`个字节复制到`destination`所指向的内存块。

深入三目运算符:JavaScript、C++ 和 Python 比较
三目运算符是编程中常用的条件表达式,它允许我们根据条件选择不同的值。我们将通过具体的例子分别介绍 JavaScript、C++ 和 Python 中的三目运算符,以便更好地理解它们的用法和特性。JavaScript 示例// 例子: 根据条件选择不同的值var x = 10;var y = 20;"x 大于 y" : "x 不大于 y";在这个例子中,如果x大于y,则result的值为 “x 大于 y”,否则为 “x 不大于 y”。C++ 示例// 例子: 根据条件选择不同的值。

Java中 && 和|| 在同一个 if 里面使用 会出现啥问题&Java中运算符“|”和“||”以及“&”和“&&”区别
如果在同一个 if 语句中同时使用 && 和 || 运算符,可能会导致逻辑错误。这样就会导致逻辑错误,当 a 为 false,b 为 true 时,输出结果会是 “Goodbye”,而不是我们期望的 “Hello World”。假设有两个布尔类型的变量 a 和 b,我们要判断当 a 为 true 或者 b 为 true 时输出 “Hello World”,否则输出 “Goodbye”。:不论运算符左侧为true还是false,右侧语句都会进行判断,下面代码。

STM32 SPI通信协议3——读取MAX6675温度传感器
无论是发送还是接收都要判断一下标志位,因为串行通信的缓冲区只有一个,即是发送缓冲区,也是接收缓冲区。接收的时候也是如此。==0的时候,MAX6675启动,此时你需要发送一个激励给他,让他启动,启动后MAX6675开始发送数据,这时候就要用到SPI_I2S_ReceiveData开始接收数据。从MAX6675的数据手册能看到D15是虚假的位,D14-D3是我们的温度数据位,D2在正常工作时为0(低电平)。==0的时候SCK启动,数据线开始发送信息,此时可以读取数据,当数据读完后,再拉高电平停止发送。

Leetcode算法系列| 11. 盛最多水的容器
给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。

C语言字符串处理提取时间(ffmpeg返回的时间字符串)
讲解字符串数据提取案例。

python爬虫之selenium模拟浏览器
之前在异步加载(AJAX)网页爬虫的时候提到过,爬取这种ajax技术的网页有两种办法:一种就是通过浏览器审查元素找到包含所需信息网页的真实地址,另一种就是通过selenium模拟浏览器的方法[1]。当时爬的是豆瓣,比较容易分析出所需信息的真实地址,不过一般大点的网站像淘宝这种是不好分析的,所以利用selenium模拟浏览器的行为来爬取数据是一个比较可行的办法。

Linux:查询当前进程或线程的资源使用情况
proc 目录是一个特殊的虚拟文件系统,它提供了对内核运行时信息的访问,包括进程、设备、网络、文件系统等各个方面的信息。它不是一个真正的文件系统,而是基于内核数据结构的一个接口,通过这个接口可以获取系统的运行时状态。:此目录以进程的 ID(PID)命名,并包含与该进程有关的文件和目录,如之前所讲的 /proc/pid/目录。:该文件包含有关 CPU(处理器)的信息,如厂商、型号、频率、缓存等。:该文件包含有关系统内存的信息,如总内存、可用内存、缓存、交换分区等。

程序,进程,线程,超线程之间的联系和区别
当我们谈到计算机程序的执行时,经常会涉及到“程序”,“进程”,“线程”和“超线程”这些概念。通过理解这些概念及其之间的联系和区别,可以帮助我们更好地理解计算机程序的执行方式和并发处理机制。来源:6547网 http://www.6547.cn/blog/442。

算法模板之栈图文详解
本文主要讲解栈的定义、用数组模拟栈的相关操作以及相关题目介绍,更多精彩内容等你来浏览。

讲解darknet: ./src/cuda.c:36: check_error: Assertion `0‘ failed.
以上是解决darknet中出现0' failed.`错误的一些建议。通过确认CUDA安装、GPU驱动程序、CUDA环境变量的正确性,并重新编译darknet,您应该能够解决这个问题。如果问题仍然存在,您可能需要进行更深入的故障排除,例如检查源代码或硬件相关问题。

算法模板之双链表图文详解
本文主要讲解双链表模板,文中带有超详细的图文讲解,希望对你的算法学习有一定的帮助。

C++会搜索的二叉树(BSTree)
本片文章主要介绍了二叉搜索树,并模拟实现!!!

算法模板之单链表图文讲解
本文主要讲解单链表模板,文中附有图文讲解,希望对你的算法学习有一定的帮助。

【剑指offer|图解|二分查找】点名 + 统计目标成绩的出现次数
本文主要讲解二分查找相关题目,文中附有图文讲解,更多精彩内容等你来浏览。

【剑指offer|图解|二分查找】点名 + 统计目标成绩的出现次数
本文主要讲解二分查找相关题目,文中附有图文讲解,更多精彩内容等你来浏览。

C/C++,FEISTDLIB的部分源代码
C/C++,FEISTDLIB的部分源代码

C/C++,动态 DP 问题的计算方法与源程序
C/C++,动态 DP 问题的计算方法与源程序

C/C++,图算法——Dinic最大流量算法
C/C++,图算法——Dinic最大流量算法

【C++干货铺】STL简述 | string类的使用指南
STL简述!!! string类接口使用指南!!!

【C++干货铺】剖析string | 底层实现
探索string底层,模拟实现string。

【C++干货铺】解密vector底层逻辑
本片文章主要是vector的介绍使用和手撕模拟实现!!!!

如何在Android平板上远程连接Ubuntu服务器使用code-server代码开发
如何在Android平板上远程连接Ubuntu服务器使用code-server代码开发

C/C++,组合算法——K人活动选择问题(Activity-Selection-Problem)的源程序
C/C++,组合算法——K人活动选择问题(Activity-Selection-Problem)的源程序

c语言如何生成随机数以及设置随机数的范围
这篇文章介绍c语言如何生成随机数以及设置随机数的范围。本文主要介绍了rand函数、srand函数、以及time函数和时间戳的概念和如何控制随机数的范围。下一篇文章将介绍利用随机数和循环来写一个猜数字游戏。