广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言经典顺序表真题演练讲解
  • 594
分享到

C语言经典顺序表真题演练讲解

2024-04-02 19:04:59 594人浏览 安东尼
摘要

目录1、移除元素2、删除有序数组中的重复项3、合并两个有序数组1、移除元素 链接直达: https://LeetCode-cn.com/problems/remove-element

1、移除元素

链接直达:

https://LeetCode-cn.com/problems/remove-element/

题目:

思路:

法一:依次挪动数据进行覆盖

从第一个数据开始进行依次遍历,如同示例1,依次遍历数组,找到移除的元素2就把后面的数据往前挪动进行覆盖,如图所示:

 此法有个缺陷,题目中明确指出使用空间复杂度O(1)的方法解决此问题,而此法的空间复杂度刚好为O(1),可以解决,不过考虑周全些,时间复杂度在情况最坏时为O(N^2),出现全是val的情况,将会挪动n-1+n-2+……出现了等差数列,时间复杂度为O(N^2),此法不是最优,换。

法二:双指针1.0

依次遍历原数组,看是不是val,把不是val的值,拷贝到新数组,此法的时间复杂度是O(N),空间复杂度也是O(N),可是题目明确指出空间复杂度要为O(1),所以此法不行,但是仔细想想,如果继续用此法双指针,但是不另开数组,就在原数组上改动可否呢?,由此引出双指针2.0

法三:双指针2.0

此法是在法二的基础上进行的升级,法二需要开辟额外数组,此法直接原数组改动。首先定义两个变量src和dst为0,都作为数组nums的下标,依次遍历src看nums[src]是否为val,若不是,将其赋给下标dst,再src++,dst++。若nums[src]=nums[dst],则只把src++,dst不动,最后再把长度dst返回即可。

代码如下:

int removeElement(int* nums, int numsSize, int val){
    int dst=0;
    int str=0;
    while(str<numsSize)
    {
        if(nums[str]==val)
        {
            str++;
        }
        else
        {
            nums[dst]=nums[str];
            dst++;
            str++;
        }
    }
    return dst;
}

2、删除有序数组中的重复项

链接直达:

Https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

题目:

思路:

双指针(不额外开数组)

此题和上题类似,同样可以采用双指针,并在原数组进行改动,只需要定义两个变量dst和src作为数组nums的下标,但此时做出小变动,把src从下标1开始,而dst从下标0开始。让nums[src]每次和它前一个也就是nums[src-1]相比较,如果相等,则src++,若不等就把nums[src-1]赋给nums[dst],再dst++,src++。

注意:

执行完上述操作后,还存在一个问题,那就是没把src的最后一个下标的值放到nums[dst]里头去,就如同本题的示例,当src走到倒数第二个值3的时候,和前一个3相等,此时需要++src,现在nums[src]就是4,和前一个值不相等,把3赋给nums[dst],此时src再++到空了,没有数据和4比较了,越界,所以4就漏掉了。在如同当后面2个数字同为3的时候,因为一直相等,src同样+到空,3同样漏掉,所以无论哪种情况,都要把最后一个数字移到nums[dst]上

画图演示:

代码如下:

int removeDuplicates(int* nums, int numsSize){
    int dst=0;
    int src=1;
    while(src<numsSize)
    {
        if(nums[src]==nums[src-1])
        {
            src++;
        }
        else
        {
            nums[dst]=nums[src-1];
            dst++;
            src++;
        }
    }
    nums[dst]=nums[numsSize-1];
    dst++;
    return dst;
}

3、合并两个有序数组

链接直达:

合并两个有序数组

题目:

思路:

法一:memmove + sort排序(冒泡、qsort等)

此法确实可以,不过当题目中明确指出要用时间复杂度O(N)的方法解决此问题的话,那么此法就行不通了,因为冒泡的时间复杂度为O(N^2),而qsort的时间复杂度为O(N*logN)。均不是O(N),所以得换。

法二:归并1.0

依次比较,每次把小的放到归并数组。此法需要开辟第三方数组a。其次,需要定义 i ,j ,dst 三个变量分别用来表示数组nums1,nums2,a的第一个下标,如果nums1[ i ]<nums[ j ],则a[dst++]=nums1[ i++ ],反之a[dst++]=nums2[ i++ ],依次遍历下去,当其中一个走完了,就把剩下的全部放到a数组里头去,此法的最大问题就是需要额外开辟一个数组,以空间换时间,导致空间复杂度为O(N),但是我们在基于此法的基础上可以进行升级,如下:

法三:归并2.0

此法是在法二的基础上进行升级,直接在nums1原数组上进行改动,思想和法二差不多。不过有个需要改变的地方,法二是正着遍历数组,但是此法则需要倒着来遍历数组。那么此时的 i 变量就是nums1数组第m-1个下标,j变量就是nums2数组第n-1个下标,dst变量就是nums1数组最后一个元素下标(m+n-1)。实现原理同法二,不做过多赘述。注意:如果nums2数组的下标 j 先结束,那么nums1剩下的数组刚好排在前面,不需要动,如果是nums1数组的下标 i 先结束,则需要把nums2数组剩余的值赋到nums1数组上去。

画图演示:

 代码如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int i=m-1;
    int j=n-1;
    int dst=m+n-1;
    while(i>=0&&j>=0)
    {
        if(nums1[i]>nums2[j])
        {
            nums1[dst--]=nums1[i--];
        }
        else
        {
            nums1[dst--]=nums2[j--];
        }
    }
    while(j>=0)
    {
        nums1[dst--]=nums2[j--];
    }
}

到此这篇关于C语言经典顺序表真题演练讲解的文章就介绍到这了,更多相关C语言 顺序表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言经典顺序表真题演练讲解

本文链接: https://www.lsjlt.com/news/145611.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言经典顺序表真题演练讲解
    目录1、移除元素2、删除有序数组中的重复项3、合并两个有序数组1、移除元素 链接直达: https://leetcode-cn.com/problems/remove-element...
    99+
    2022-11-13
  • C语言经典顺序表实例分析
    这篇“C语言经典顺序表实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言经典顺序表实例分析”文章吧。1、移除元素题...
    99+
    2023-06-30
  • C语言全面讲解顺序表使用操作
    目录一、顺序表的结构定义二、顺序表的结构操作1.初始化2.插入操作3.删除操作4.扩容操作5.释放操作6.输出三、示例编程环境为 ubuntu 18.04。 顺序表需要连续一片存储空...
    99+
    2022-11-13
  • C语言深入浅出讲解顺序表的实现
    目录1.线性表2.顺序表2.1 概念及结构2.2 提供接口2.3 接口实现今天起开始编写数据结构中的各种数据结构及算法的实现,说到顺序表,我们首先得了解下线性表。 1.线性表 线性表...
    99+
    2022-11-13
  • C语言数据结构顺序表的进阶讲解
    目录前言一、顺序表的构造VS功能1.顺序表的构造2.接口实现(功能)二、功能具体分析1.初始化2.销毁3.检查size与capacity是否溢出4.尾增功能(实现)5.打印三、实现具...
    99+
    2022-11-13
  • c语言经典习题之逆序字符串详解
    目录使用指针逆序字符串使用递归逆序字符串逆序带空格的字符串总结使用指针逆序字符串 思路: 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置交换两个指针位置上的字...
    99+
    2022-11-12
  • C语言堆排序经典算法TopK问题解析
    目录问题描述:快速排序TopK问题描述: 从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题 什么是TopK,就是找到一个无序队列中的k个最大数。 TopK...
    99+
    2023-05-15
    C语言堆排序TopK算法 TopK算法问题
  • C语言超详细讲解顺序表的各种操作
    目录顺序表是什么顺序表的结构体顺序表的接口函数顺序表相关操作的菜单顺序表的初始化添加元素陈列元素往最后加元素往前面加元素任意位置加元素删除最后元素删除前面元素 删除任意元素...
    99+
    2022-11-13
  • C语言堆排序经典算法TopK问题怎么解决
    本文小编为大家详细介绍“C语言堆排序经典算法TopK问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言堆排序经典算法TopK问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题描述:从a...
    99+
    2023-07-05
  • C语言实例真题讲解数据结构中单向环形链表
    目录1、例题引入2、何为带环链表3、题解思路4、拓展问题目录 1、例题引入 链接直达: 环形链表 题目: 2、何为带环链表  正常的单链表每个节点顺次链接,最后一个节点指...
    99+
    2022-11-13
  • C语言编程简单却重要的数据结构顺序表全面讲解
    目录前言一、线性表定义二、顺序表实现1概念及结构2静态顺序表2.1实现顺序表接口,第一步要对顺序表进行初始化2.2对顺序表的增删查改的接口函数(以尾插为例)3动态顺序表3.1动态顺序...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作