数据结构十一:数组相关经典面试题

       本篇博客详细介绍分析数组/顺序表常见的面试题,对于前面所学知识进行一个巩固,同时介绍一些力扣刷题中的一些概念:如:输出型参数等,在刷题中培养自己的编程思维,掌握常见的编程套路,形成题感!

第一题:移除元素

1.1 题目描述

 

1.2 解题分析

        本题另加要求:时间复杂度为O(n),  如果单纯利用顺序表删除元素的思想:只要遇到待删除指定元素,则从该元素位置开始,从前依次向后挪动数据进行元素覆盖,从而达到删除元素的效果,但是这样如果数组长度较大且该值出现次数非常多,那么,它的时间复杂度为:O(n^2)不符合要求,因此,这种思路时间复杂度不符合要求,换种思路:如果没有空间复杂度要求,我们可以这么做,先申请一块同样大小的数组,将原数组从前向后遍历,不等于待删除元素的,将其放到新数组,等于待删除元素的留在原地不要动,最后再将新数组元素遍历依次赋值给原数组,便可以达到要求,但是,这样空间复杂度不符合要求!!O(n)

        经过上面的分析,我们如果不申请数组,直接在原数组上直接进行覆盖,那是不是就可以达到要求?答案是肯定的!这便要引入:双指针思想。

1.3 实现过程

   借助双指针思想,时间复杂度O(n),空间复杂度:O(1) 思路如下:

  1. step1. 定义两个整型变量,用作数组的指针,同时赋值为0
  2. step2. 让一个指针src从前向后遍历原数组,如果当前位置是待删除元素,该指针src直接向后走,如果当前位置不是待删除元素,则将该位置元素赋值为另一个指针dst指向的位置,同时这两个指针同时向后走一步;
  3. step3. 直到原数组遍历结束,此时dst所指的位置就是当前数组的有效元素个数,也就是数组的长度,直接返回。

上述这种思想,就可以达到把原数组等于待删除元素的值全部覆盖,从而达到删除的效果!

 

1.4代码实现

int removeElement(int* nums, int numsSize, int val) 
{//1.定义两个指针int src =0,dst=0;//2.从头开始遍历数组while(src<numsSize){  //3.当前元素不是待删除元素,赋值给dst下标,src、dst继续往后走if(nums[src]!=val){nums[dst]=nums[src];dst++;src++;}//4. 当前元素是待删除元素,不要动,src直接往后遍历,等待不是待删除元素进行覆盖else{src++;}}return dst;
}

第二题:删除有序数组中的重复项

2.1 题目描述

 

2.2 解题分析

      本题与上题有异曲同工之处,同样是删除元素,但是这道题实质上是去重复元素,只保留其中的一个,并且也是要求在原数组基础上进行删除,因此也是借助双指针思想,找到不相同元素,然后进行元素覆盖。

2.3 实现过程

借助双指针思想,时间复杂度O(n),空间复杂度:O(1) 思路如下:

  1. step1. 定义三个整型变量prev、cur、dst,用作数组的指针,其中prev和cur用来比较相邻的两个元素是否相同,dst用来进行元素覆盖。
  2. step2. 如果相邻的两个元素相同,直接让指针prev和cur向后走,dst不要动,如果相邻的两个元素不相同,只会是两种情况:第一种它是一连串相同数字的最后一个,第二种它是一个单独出现的数字(如上面实例2所示),对于第一种情况,很好处理,直接将prev所处位置的元素赋值给dst下标的位置,然后三个指针同时向后走,对于第二种情况,需要最后单独赋值一次,因为:此时cur已经越界,循环无法进入,最后一个单独出现的数字并没有赋值给dst位置,需要单独处理!!!
  3. step3.直到原数组遍历结束,注意:遍历的结束条件为:cur<numsSize,不能用prev,因为cur此时已经越界,无法再继续往后比较了。此时dst所指的位置就是当前数组的有效元素个数,也就是数组的长度,直接返回。

    上述这种思想,就可以达到把原数组等于待删除元素的值全部覆盖,从而达到删除的效果!

 

 

 

2.4代码实现

int removeDuplicates(int* nums, int numsSize) {//判空,空数组无法删除if(numsSize==0)return 0;int prev=0,cur=1,dst=0;while(cur<numsSize){if(nums[prev]==nums[cur]){prev++;cur++;}else{nums[dst]=nums[prev];prev++;cur++;dst++;}}nums[dst]=nums[prev];prev++;dst++;return dst;
}

这道题注意边界条件的处理,以及特殊情况的处理,本质思想同第一题。 

第三题:合并两个有序数组

3.1 题目描述

3.2 解题分析

3.3 实现过程

3.4代码实现

第四题:旋转数组

4.1 题目描述

4.2 解题分析

4.3 实现过程

4.4代码实现

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

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

相关文章

嵌入式Linux学习第二天

今天学习linuxC编程。首先要熟悉linux下编写c程序的过程。 编写程序Hello World! 首先创建存放程序的文件夹&#xff0c;如下图所示&#xff1a; 接下来在创建一个文件夹来保存这节要编写的代码。指令&#xff1a;mkdir 3.1 接下来我们要设置VIM编辑器的一些配置&#xff0…

自定义类型②③——联合体和枚举

自定义类型②③——联合体和枚举 1.联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员结构体和联合体的对比1.4 联合体大小的计算1.5 联合体的应用①1.5 联合体的应用② 2. 枚举2.1 枚举类型的声明2.2 枚举类型的特点2.3 枚举的优点 1.联合体 1.1 联合体类型的声明 关…

【C语言】高质量选择题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…

腾讯地图商业授权说明一篇文章讲清楚如何操作

最近在使用腾讯地图&#xff0c;发现我要上架应用商店APP需要我有地图的授权书。 认真研究了一下原来腾讯地图现在要收费了&#xff0c;如果你打算以商业目的使用它&#xff0c;比如对第三方用户收费或者进行项目投标等&#xff0c;就需要先获取腾讯位置服务的商业授权许可。申…

Netty核心线程模型源码分析

文章目录 一、Netty线程模型简介二、Netty线程模型源码分析1. 服务端源码分析 一、Netty线程模型简介 Netty的线程模型图如下所示&#xff1a; 具体细节看这篇博客 二、Netty线程模型源码分析 1. 服务端源码分析 首先我们在写Netty服务端程序的时候最开始是下面两句代码&a…

Vue中Element的下载

打开vscode让项目在终端中打开 输入npm install element-ui2.15.3 然后进行下载 在node_modules中出现element-ui表示下载完成 然后在输入Vue.use(ElementUI); import Vue from vue import App from ./App.vue import router from ./router import ElementUI from element-ui…

基于树的时间序列预测(LGBM)

在大多数时间序列预测中&#xff0c;尽管有Prophet和NeuralProphet等方便的工具&#xff0c;但是了解基于树的模型仍然具有很高的价值。尤其是在监督学习模型中&#xff0c;仅仅使用单变量时间序列似乎信息有限&#xff0c;预测也比较困难。因此&#xff0c;为了生成足够的特征…

Day62:单调栈 LeedCode503. 下一个更大元素 II 42. 接雨水

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

【从零开始学架构 前言】整体的学习路线

本文是《从零开始学架构》的第一篇学习笔记&#xff0c;在工作6年左右的这个时间点需要有一些先行的理论来指导即将面临的复杂实践&#xff0c;以便在真正面临复杂实践的时候能有所参照。 主要从以下几个方面和顺序来进行学习 架构基础&#xff1a;从架构设计的本质、历史背景…

【Leetcode 42】 接雨水

基础思路&#xff1a; &#xff08;1&#xff09;需要将问题最小化&#xff0c;首先计算第i个位置最多容纳多少雨水&#xff08;细长的一条水柱&#xff09;&#xff0c;然后求和就是总的雨水量&#xff1b; &#xff08;2&#xff09;第i个位置容纳雨水量 min(左侧最高, 右…

计算机组成结构—高速缓冲存储器(Cache)

目录 一、Cache的基本工作原理 1.Cache工作原理 2.命中率 3.Cache的基本结构 4.Cache的改进 二、Cache和主存之间的映射方式 1.直接映射 2.全相联映射 3.组相联映射 三、Cache中主存块的替换算法 四、Cache的写策略 概为了解决 CPU 和主存之间速度不匹配的问题&#x…

达梦主从数据库实例恢复

测试环境&#xff1a;实时主备数据库 1、在节点1向测试表aaa插入数据 如图可见&#xff0c;会话139695153554808向aaa表插入了10000行数据。事务id460520。 2、提交前在另一个窗口kill掉dmserver进程。 3、查看节点2的数据库日志 上图可见&#xff0c;系统执行alter database…

Docker网络基础

简介 Docker 本身的技术依赖于近年来 Linux 内核虚拟化技术的发展,Docker 对 Linux 内核的特性有很强的依赖。Docker 使用到的与 Linux 网络有关的主要技术有:网络命名空间、veth 设备对、网桥、ipatables 、路由。 网络命名空间 为了支持网络协议栈的多个实例,Linux在网络栈…

2024广州高端房产/留学移民/海外院校/国际教育展

2024广州海外置业移民留学展览会 The 7th Guangzhou Overseas Real Estate Immigrant Study Exhibition 2024年7月27日-28日 27th-28th July, 2024 广州保利世贸博览馆&#xff08;海珠区新港东路1000号&#xff09; Guangzhou Poly World Trade …

锂电池SOH估计 | Matlab实现基于ALO-SVR模型的锂电池SOH估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOH估计 | Matlab实现基于ALO-SVR模型的锂电池SOH估计 蚁狮优化支持向量机锂电池健康状态SOH估计&#xff1b; 具体流程如下&#xff1b; 1、分析锂离子电池老化数据集&#xff0c;从中选取具有代表电池性能衰减…

dumpsys meminfo 流程中细节

源码基于&#xff1a;Android U 参考&#xff1a; dumpsys meminfo 详解(R) dumpsys meminfo 详解(U) 1. 命令入口 MemBinder frameworks/base/services/core/java/com/android/server/am/AMS.javastatic class MemBinder extends Binder {ActivityManagerService mActivity…

python 中如何匹配字符串

python 中如何匹配字符串&#xff1f; 1. re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 import re line"this hdr-biz 123 model server 456" patternr"123" matchObj re.matc…

一键安装Halo DB

说明 这里说的一键其实分了好几步&#xff0c;是我将安装步骤分解。你可以把它们放在一个shell中或者串起来就是一键了。 易景科技的数据库 羲和 &#xff08;Halo DB&#xff09; 我之前的一位朋友&#xff08;章晨曦&#xff09;创立的数据库公司。以前看他朋友圈说他做数…

私域流量引流方式有哪些?

私域流量引流的方法无非是营销渠道投放、各平台KOL投放、自有自媒体平台账号内容引流、线下引流、老客户转介绍裂变等几个方面&#xff0c;下面对各种不同方法进行简单介绍。 1、营销渠道投放&#xff1a;选择广点通、粉丝通、某些app的信息流和dou等大平台自带的推广渠道工具…

npy文件如何追加数据?

.npy 文件是 NumPy 库用于存储数组数据的二进制格式&#xff0c;它包含一个描述数组结构的头部信息和实际的数据部分。直接追加数据到现有的 .npy 文件并不像文本文件那样直接&#xff0c;因为需要手动修改文件头部以反映新增数据后的数组尺寸&#xff0c;并且要确保数据正确地…