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

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

第一题:移除元素

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.hqwc.cn/news/670933.html

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

相关文章

Jupyter配置

修改Jupyter打开界面 &#xff08;1&#xff09;打开【Anaconda Prompt】&#xff0c;输入【jupyter notebook --generate-config】命令 从运行结果可知【jupyter_notebook_config.py】的位置 &#xff08;2&#xff09;使用【记事本】打开 找到# c.NotebookApp.notebook_…

【菜单下拉效果】基于jquery实现二级菜单下拉效果(附完整源码下载)

Js菜单下拉特效目录 &#x1f354;涉及知识&#x1f964;写在前面实现效果&#x1f367;一、涉及知识&#x1f333;二、具体实现2.1 搭建一级菜单2.2 搭建二级菜单项2.3 引入js文件2.4 构建CSS文件 &#x1f40b;三、源码获取&#x1f305; 作者寄语 &#x1f354;涉及知识 ht…

leetCode76. 最小覆盖子串

leetCode76. 最小覆盖子串 题目思路 代码 // 双指针 哈希表 // 这里cnt维护过程&#xff1a;先找到能够匹配T字符串的滑动窗口&#xff0c;然后这个cnt就固定了&#xff0c;因为i向前移动的同时&#xff0c;j也会维护着向前 // 就是当又出现能够满足T字符串的时候&#xff0…

【计算机网络原理】万字长文,持续更新...

文章目录&#x1f970; 计算机网络原理1.2 因特网概述1 网络、互联网&#xff08;互连网&#xff09;和因特网2 因特网发展的三个阶段ISP的概念基于ISP的三层结构的因特网 3 因特网的标准化工作4 因特网的组成 1.3 三种交换方式&#xff1a;电路交换、分组交换和报文交换电路交…

MySQL CRUD操作

前言&#x1f440;~ 上一章我们介绍了数据库的一些基础操作&#xff0c;关于如何去创建一个数据库&#xff0c;还有使用数据库&#xff0c;删 除数据库以及对表进行的一些基础操作&#xff0c;今天我们学习CRUD操作 俗称&#xff08;增删改查&#xff09; 如果各位对文章的内…

《QT实用小工具·五十五》带有标签、下划线的Material Design风格输入框

1、概述 源码放在文章末尾 该项目实现了一个带有标签动画、焦点动画、正确提示、错误警告的单行输入框控件。下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LABELEDEDIT_H #define LABELEDEDIT_H#include <QObject> #include <QWidget>…

问题管理员的工作角色、职责和技能

问题管理就是识别、分析和解决反复出现的根本原因问题并永久修复它们。听起来很简单对吧&#xff0c;不幸的是&#xff0c;情况并非总是如此。对于组织来说&#xff0c;IT问题管理一直是一门棘手的 ITSM 学科。一个经常被忽视的关键因素是有效的问题 管理不仅仅是工具和流程。 …

2024.5.6

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口大小this->resize(1000,740);//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\Administrator\\Desktop\\pictrue\\Plants.png"));//设置窗口标题this-…

Codeforces Round 943 (Div. 3) A~E

A. Maximize? Problem - A - Codeforces 给定x求出使这个式子最大的y&#xff1a; 不用想复杂直接循环枚举即可。 #include<bits/stdc.h> using lllong long; ll n,m; void solve() {int x;std::cin>>x;ll ans0,y;for(int i1;i<x;i){if(std::__gcd(i,x)i>a…

探索Kimi模型AI:革新人工智能的未来

探索Kimi模型AI&#xff1a;革新人工智能的未来 人工智能&#xff08;AI&#xff09;技术的发展已经取得了巨大的进步&#xff0c;为我们的生活带来了许多便利和创新。在这个充满活力和竞争的领域中&#xff0c;Kimi模型AI以其独特的设计和功能吸引了人们的注意。本文将深入探…

图片浏览器-PicView

一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器&#xff0c;配备了干净简洁的用户界面&#xff0c;可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型&#xff0c;包括&#xff1a;WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…

快速编写测试用例(超详细~)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 当你学会了如何设计测试用例之后&#xff0c;接下来便是开始用例…