【数据结构】链表OJ题(顺序表)(C语言实现)

请添加图片描述

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

📝数据结构OJ题

  • ✏️移除元素
  • ✏️ 删除重复项
  • ✏️ 合并两个数组

✏️移除元素

在这里插入图片描述

题目链接:原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)
我在这里给大家提供了常规的三种解法,第一种解法是错误示范

解法一:大家首先肯定想到的是边遍历边删除,当然这也是常用的方法,但是实际上这个解法一是错误的

int removeElement(int* nums, int numsSize, int val)
{
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] == val)
        {
            for (int j = i; j < numsSize - 1; j++)
            {
                nums[j] = nums[j + 1];
            }
            numsSize--;
        }
    }
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] == val)
        {
            for (int j = i; j < numsSize - 1; j++)
            {
                nums[j] = nums[j + 1];
            }
            numsSize--;
        }
    }
    return numsSize;
}

大家可以看到在这里我用到了两次for循环进行遍历和删除而且是一模一样的,大家可以看下面的图:在这里插入图片描述
会出现两个相邻的数是一样的,如果你把前面的那个9去除了,那么后面那个9就会移到前面那个数的位置,而此时那个位置已经检查过了,所以第二个9就没发删除,就会遗留下来:
在这里插入图片描述
所以这里就采用两次循环就可以解决,但是问题来了,如果是三个相邻的数相同,是不是就得用三个for循环,那如果是四个,五个呢,所以该解法错误的原因在这里。当然你也可以先找到最多有几个相同并且相邻的数的次数,然后再用for循环当然这也可以,但是太复杂了,大家还是看看解法二。

解法二:该解法用了指针

int removeElement(int* nums, int numsSize, int val)
{

    int* ret = nums;//重新定义一个新的数组空间
    int sum = 0;
    while (numsSize)
    {
        if (*nums != val)
        {
            *ret++ = *nums++;   //把不同的数移到新的数组空间中
            sum++;                     //记录新数组的长度
        }
        else
        {
            nums++;
        }
        numsSize--;
    }
    return sum;
}

解法二是利用了指针,解法才变得简单起来。

解法三:用了两个变量

int removeElement(int* nums, int numsSize, int val) {
    int right = 0 ;
    int left  = 0 ;
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] != val)
         {
            nums[left] = nums[right] ;
            left++;
            right++;
         }
        else
            right++;
    }
    return left;
}

在这里也是利用两个变量相互移动及赋值,不过这种解法教于指针更容易理解。

✏️ 删除重复项

在这里插入图片描述

题目链接: 删除排序数组中的重复项

解法

int removeDuplicates(int* nums, int numsSize) {
    int left = 0 ;
    int right = 0 ;
    for(int i = 0; i < numsSize-1; i++)
    {
        if (nums[i] != nums[i+1])
        {
             left++;
             right++;
             nums[left] = nums[right] ;
        }
        else
        right++;
    }
    return left+1;
}

在这里还是利用了两个变量来记录数组元素的变化及移动,和上一题的解法三还是挺类似的,不过还是有一点差别。因为上一题我们是先赋值再移动,而这一题我们是先移动再赋值。为什么第二题就要先移动再赋值呢,这是因为我们这里是要保留一个,删除重复的,而第一题是直接删除。

✏️ 合并两个数组

在这里插入图片描述

题目链接: 合并两个有序数组

解法

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

首先这一题无论是初始的两个数组还是后面合并的数组都是要求数据以递增的形式呈现。

在这里插入图片描述

上幅图中就是题目所给的两个有序数组和一些条件。
按照题目意思我们只能从后面把数据填进去,如果从前面会覆盖一些数据,造成数据丢失。

利用遍历来做,因为题目要求数据是递增的形式。所以只能利用遍历,一边遍历一边比大小。

在这里又要分两种情况:
第一种:n1还有剩余,m1已经分配完了,如下图所示

在这里插入图片描述

在这里插入图片描述
在这里m1是已经为0了,所以会跳出循环,然后直接把nums2中剩余的数补到nums1的前面就可以了。

第二种:m1还有剩余,n1已经分配完了,如下图所示

在这里插入图片描述
在这里插入图片描述
像这种情况就可以直接结束了。

知道这两种情况后,应该就能明白我们后面为什么会加一个循环,就是为了防止第一种情况的出现。

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制造业需要MES与ERP的整合

MES与ERP整合 在当今的制造环境中&#xff0c;这不是 MES 与 ERP 的对比&#xff1b;MES 和 ERP 一起带来了两个系统都无法单独提供的操作清晰度。 ERP 专注于创建和管理工厂计划&#xff0c;包括生产、材料使用、交付和运输&#xff0c;以及收集相关业务的信息。另一方面&…

数据可视化工具选择:功能、易用性与安全性

作为一名数据可视化大屏设计师&#xff0c;我深知选择一款合适的数据可视化工具对于提高工作效率和呈现效果的重要性。下面&#xff0c;我将从真正对我们数据可视化大屏设计师有用的角度为大家介绍选择数据可视化工具的一些必要条件和要求。 1. 功能强大与灵活定制 首先&…

Python语言基础学习大纲(由某大模型生成)

自从上次经丙察察游了一次滇藏线&#xff0c;已有3个没写一篇了。今天利用由某大模型生成的上面这张思维导图&#xff0c;配合这个大模型生成的6000多字拼凑出一篇博文聊以交差。 Python语言概述 一、语言特点 1.语法简单明了 Python的语法简洁易懂&#xff0c;使得编写代码…

双列集合 Map常见的API Map遍历方式 HashMap LinkedHashMap treeMap

目录 双列集合双列集合的特点 双列集合体系结构Map常见的APIMap遍历方式Map的遍历方式一(键找值)遍历方式二键值对遍历方式三lambda表达式 HashMap练习1练习二LinkedHashMapTreeMapTreeMap练习1二三 双列集合 双列集合可以记录两个元素.一个称为键一个称为值.合称为键值对,又叫…

C语言-详解指针

目录 一.内存 1.内存的定义 2.内存的结构图 二.地址 1.什么是地址 2.什么是变量的地址 三.什么是指针 1.指针的定义 四.如何获取数据存储空间的地址 1.&运算符 五.指针变量 1.什么是指针变量&#xff08;一级指针变量&#xff09; 2.指针变量的定义 3…

LLM之Agent(四)| AgentGPT:一个在浏览器运行的Agent

AgentGPT是一个自主人工智能Agent平台&#xff0c;用户只需要为Agent指定一个名称和目标&#xff0c;就可以在浏览器中链接大型语言模型&#xff08;如GPT-4&#xff09;来创建和部署Agent平台。 PS&#xff1a;目前agentGPT仅支持chatgpt模型&#xff0c;暂时不支持本地llm模…

数字串最大乘积切分(动态规划)

不得不说&#xff0c;动态规划是真的骚 题解已经在图片里面了 代码如下&#xff1a; #include<stdio.h> long long gethnum(long long n);int main(void) {//定义变量并输入int N, M;long long dp[19][7] {0}, num[20][20] {0};scanf("%d%d", &N, &am…

2023年【A特种设备相关管理(锅炉压力容器压力管道)】考试内容及A特种设备相关管理(锅炉压力容器压力管道)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试内容根据新A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将A特种设备相关管理…

【数据中台】开源项目(5)-Amoro

介绍 Amoro is a Lakehouse management system built on open data lake formats. Working with compute engines including Flink, Spark, and Trino, Amoro brings pluggable and self-managed features for Lakehouse to provide out-of-the-box data warehouse experience,…

Salesforce认证考试,这5招让你轻松过关!

认证是很多求职者获得第一份Salesforce工作的敲门砖。认证不仅是个人能力的体现&#xff0c;而且在学习备考的过程中&#xff0c;可以更系统地梳理知识&#xff0c;了解最新的产品和功能&#xff0c;对Salesforce有更全面和深入的认识。 大多数Salesforce从业者都至少持有一项…

Maxwell学习笔记

1 概述 Maxwell 是由美国 Zendesk 开源&#xff0c;用 Java 编写的 MySQL 实时抓取软件。 实时读取MySQL 二进制日志 Binlog&#xff0c;并生成 JSON 格式的消息&#xff0c;作为生产者发送给 Kafka&#xff0c;Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台…

多线程--11--ConcurrentHashMap

ConcurrentHashMap与HashMap等的区别 HashMap线程不安全 我们知道HashMap是线程不安全的&#xff0c;在多线程环境下&#xff0c;使用Hashmap进行put操作会引起死循环&#xff0c;导致CPU利用率接近100%&#xff0c;所以在并发情况下不能使用HashMap。 ConcurrentHashMap 主…

UVM实现component之间transaction级别的通信

my_model是从i_agt中得到my_transaction&#xff0c;并把 my_transaction传递给my_scoreboard。在UVM中&#xff0c;通常使用TLM&#xff08;Transaction Level Modeling&#xff09;实现component之间transaction级别 的通信。 在UVM的transaction级别的通信 中&#xff0c;数…

【已验证】SqlBulkCopy 执行批量插入的时候报超时问题-解决办法

把datatable里面的数据插入到数据库&#xff0c;但是数据量大的情况下批量插入会提示超时&#xff0c;所以把datatable的数据分批写入数据库的 using (SqlConnection connection new SqlConnection(ConnectionString)){connection.Open();int pageSize 100000;//SqlBulkCopy大…

Linux各目录结构说明

文章目录 目录说明源码放哪里&#xff1f;拓展&#xff1a;Linux里面安装软件是装在home目录还是opt目录还是/usr/local好&#xff1f; bin boot dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var 目录说明 bin 存放二进制可执行文件&…

C语言每日一题(46)整数转罗马数字

力扣网12 整数转罗马数字 题目描述 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D …

手机如何设置防骚扰电话?

很多人都曾接到过烦人的推销电话&#xff0c;这些电话不仅让人感到烦恼&#xff0c;而且有时候还会接二连三地打来&#xff0c;让人不胜其烦。我们的手机号码似乎已经被泄露&#xff0c;很难避免这些骚扰。 有时&#xff0c;我们因无法忍受骚扰电话而选择立即将其拉黑&#xff…

ROW_NUMBER()函数——(分组后取每组最新的两条数据)

ROW_NUMBER() 功能&#xff1a;简单的说row_number()从1开始&#xff0c;为每一条分组记录返回一个数字。 用法一&#xff1a; ROW_NUMBER() OVER (ORDER BY col DESC) 说明&#xff1a;先把col列降序&#xff0c;再为降序后的每条col记录返回一个序号 用法二&#xf…

Linux系统---图书管理中的同步问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、问题描述 &#xff08;1&#xff09;图书馆阅览室最多能够容纳N&#xff08;N5&#xff09;名学生&#xff0c;若有更多学生想…

玩转大数据7:数据湖与数据仓库的比较与选择

1. 引言 在当今数字化的世界中&#xff0c;数据被视为一种宝贵的资源&#xff0c;而数据湖和数据仓库则是两种重要的数据处理工具。本文将详细介绍这两种工具的概念、作用以及它们之间的区别和联系。 1.1. 数据湖的概念和作用 数据湖是一个集中式存储和处理大量数据的平台&a…