数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)

这篇具有很好参考价值的文章主要介绍了数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原地移除元素

题目:来源力扣。

数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组),数据结构,数据结构,c语言,开发语言

思路1

在单数组里面历遍找val,如果是val,就删除。不是就跳过。

时间复杂度O(n^2),最坏情况每个都是val。相当于一个等差数列。

比如

输入:nums = [0,1,2,2,3,0,4,2], val = 2
  • 下标0开始找,0不是,不动数组
  • 下标1,1不是,不动数组
  • 下标2,2是,删除元素,变成【0,1,2,3,0,4,2】
  • 下标2,2是,删除元素,变成【0,1,3,0,4,2】
  • 下标2,3不是,不动数组
  • 下标3,0不是,不动数组
  • 下标4,4不是,不动数组
  • 下标5,5是,删除元素,变成【0,1,3,0,4】
  • #include <stdio.h>
    
    int removeElement(int nums[], int length, int val) 
    {
        // 初始化计数器
        int count = 0;
    
        // 遍历数组
        for (int i = 0; i < length; i++) 
        {
            // 如果当前元素不等于 val
            if (nums[i] != val) 
            {
                // 将当前元素移到数组的正确位置
                nums[count] = nums[i];
                // 更新计数器
                count++;
            }
        }
    
        // 返回新长度
        return count;
    }
    
    int main() 
    {
        // 示例用法
        int nums[] = {3, 2, 2, 3, 4, 5, 6};
        int length = sizeof(nums) / sizeof(nums[0]);  // 计算数组长度
        int val = 3;
    
        // 调用移除元素的函数
        int newLength = removeElement(nums, length, val);
    
        // 打印移除后的数组元素
        for (int i = 0; i < newLength; i++) 
        {
            printf("%d ", nums[i]);
        }
    
        return 0;
    }
    

思路2

以空间换时间,时间复杂度O(n),空间复杂度O(n)。

新开辟一块空间,将不是val的值储存到新空间中。重新统计新数组的元素个数。

这里不做代码展示。


思路3 

双指针,用src(用来判断元素是不是val)和dst(保存不是val的元素)。

1。不是val,src++,dst++。

2.是val,src++。

时间复杂度O(n),时间复杂度O(1)。

例子

输入:nums = [0,1,2,2,3,0,4,2], val = 2

下标0,0不是,src++到下标1,dst++,记录dst++为src下标0:0。

下标1,1不是,src++到下标2,dst++,记录dst++为src下标1:1。

下标2,2是,src++到下标3,dst不变。

下标3,2是,src++到下标4,dst不变。

下标4,3不是,src++到下标5,dst++,记录dst++为src下标4:3。

下标5,0不是,src++到下标6,dst++,记录dst++为src下标5:0。

下标6,4不是,src++到下标7,dst++,记录dst++为src下标6:4。

下标7,2是,src++,历遍完全部数组,结束。

此时,dst的数组值为【0,1,3,0,4】,dst移动4次,包括开始的,5个数。

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

 

合并两个有序数组

题目:来源力扣。

数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组),数据结构,数据结构,c语言,开发语言


思路

为避免0的影响,两个数组选最大的依次排序,从大到小排序,将最大的排在最后面,以此类推至最前面。

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{
    int end1=m-1;
    int end2=n-1;
    int end=m+n-1;
    while(end1>=0  &&  end2>=0)//都没有结束
    {
        if(nums1[end1]>nums2[end2])
        {
            nums1[end]= nums1[end1];
            --end;
            --end1;
        }
        else
        {
            nums1[end]=nums2[end2];
            --end;
            --end2;
        }
    }
     while(end2>=0)
     {
         nums1[end]=nums2[end2];
         --end;
         --end2;
     }
}
  1. 首先,初始化三个指针 end1end2 和 end,分别指向 nums1nums2 和合并后的数组的末尾。

  2. 进入循环,条件是两个数组都还没有遍历完成。在循环中,比较 nums1 和 nums2 中指针位置的元素大小:

    • 如果 nums1[end1] 大于 nums2[end2],将 nums1[end1] 复制到合并后的数组的末尾,并分别减小 end 和 end1 的值。
    • 否则,将 nums2[end2] 复制到合并后的数组的末尾,并分别减小 end 和 end2 的值。
  3. 如果第一个数组 nums1 还有剩余元素未遍历,而第二个数组 nums2 已经遍历完了,那么将剩余的 nums1 元素复制到合并后的数组中。文章来源地址https://www.toymoban.com/news/detail-816919.html

到了这里,关于数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】移除链表元素-图文解析(单链表OJ题)

    LeetCode链接:203. 移除链表元素 - 力扣(LeetCode) 本文导航 💭做题思路 🎨画图更好理解: ✍️代码实现 🗂️分情况讨论: ❄️极端情况: 遍历链表,找到值为 val 的节点删除 这里需要两个指针  cur 用来遍历链表  prev 指向 cur 的前一个位置,方便删除一个节点后,链接前

    2024年02月14日
    浏览(26)
  • 顺序表链表OJ题(3)——【数据结构】

    W...Y的主页 😊 代码仓库分享 💕 前言:  今天是链表顺序表OJ练习题最后一次分享,每一次的分享题目的难度也再有所提高,但是我相信大家都是非常机智的,希望看到博主文章能学到东西的可以一键三连关注一下博主。 话不多说,我们来看今天的OJ习题.。 【leetcode 142.环

    2024年02月10日
    浏览(34)
  • 顺序表链表OJ题(2)->【数据结构】

    W...Y的主页 😊 代码仓库分享 💕 前言: 单链表的结构常常不完美,没有双向链表那么”优秀“,所以繁衍出很多OJ练习题。今天我们继续来look look数据结构习题。 下面就是OJ时间!!! 【链表中倒数第K个节点】——牛客网 OJ链接 描述 输入一个链表,输出该链表中倒数第

    2024年02月10日
    浏览(31)
  • 数据结构——二叉树(OJ练习)

    大家好,本期是二叉树的最后一期,这一期我们来看看二叉树的编程题 . - 力扣(LeetCode) 首先我们的思路是: 遍历二叉树,把每个节点去比较一次,按照要求返回 我们来看代码 . - 力扣(LeetCode) 这里我们的思路是:同时遍历两给树,遇到空树或者不相等时返回。 . - 力扣

    2024年04月12日
    浏览(29)
  • 【数据结构练习】单链表OJ题(一)

    题目: 思路1: 在原来的链表上进行修改,节点的数据是val的删除,然后前后再连接起来。 需要考虑的因素: 1.要删除的节点位置在第一个节点; 2.要删除的节点位置在中间任意一个节点; 3.要删除的节点位置在最后一个节点 用一个变量cur遍历链表,要删除的节点是头节点

    2024年02月11日
    浏览(49)
  • 【数据结构练习】单链表OJ题(二)

    题目: 示例: 注意:不能根据节点的值来比较是否相交,而是根据节点在内存中是否指向相同的位置。 例如以上图: 链表A:4、1、8、4、5 链表B:5、6、1、8、4、5 链表A和链表B都有节点的值为1,但是它们在内存中指向不同的位置,而值为8的节点(A的第三个节点、B的第四个

    2024年02月11日
    浏览(28)
  • 【数据结构】时间复杂度---OJ练习题

    目录 🌴时间复杂度练习 📌面试题---消失的数字 题目描述 题目链接:面试题 17.04. 消失的数字 🌴解题思路 📌思路1: malloc函数用法  📌思路2: 📌思路3: 🙊 如果有不了解时间复杂度的请移步上一篇文章:【数据结构】初识 题目描述 数组 nums 包含从 0 到 n 的所有整数,

    2024年02月16日
    浏览(26)
  • 万字精讲——数据结构栈与队列必会OJ练习

    W...Y的主页 💕 代码库分享 😊 在之前的博客中,我们学习了栈与队列的基本内容,并且实现了栈与队列。今天我们进行刷题训练,走进栈与队列的世界中去感受一番!!! 目录 括号匹配问题  使用队列实现栈 用栈实现队列 设计循环队列 给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{

    2024年02月10日
    浏览(34)
  • 【数据结构】——线性表(顺序表加链表),万字解读(加链表oj详解)

    前言 由于之前存在过对两者的区别考虑,所以把他们放在一起来说,更加容易区别和理解 对于有关线性表的概念这里就不展示了,这里主要是介绍线性表里面的这两个结构的知识点 一.顺序表 1.顺序表介绍 顺序表的存储结构和逻辑结构都是相邻的, 这里如果我们把a1的地址

    2024年03月22日
    浏览(75)
  • 数据结构:链表基础OJ练习+带头双向循环链表的实现

    目录 一.leetcode剑指 Offer II 027. 回文链表 1.问题描述 2.问题分析与求解 (1) 快慢指针法定位链表的中间节点 (2) 将链表后半部分进行反转 附:递归法反转链表 (3) 双指针法判断链表是否回文 二.带头双向循环链表的实现 1.头文件 2.节点内存申请接口和链表初始化接口 3.链表的打

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包