顺序表leetcode刷题(C语言版)

news2024/9/18 16:01:12

一.移除元素

3ef8dcd91b6b480dae6b64437441c504.png

对于本题,共有两种解法:

思路一:创建新的数组,遍历原数组,将不为value的值放到新数组中,但本题不允许使用新的数组,因此该方法不行

思路二:使用快慢指针,原数组基础上进行修改,源数据、目标数据,分别用src和dst两个指针指向;src指向的值为value,则往后走,即++;若src指向的值不是value,则nums[dst]=nums[src],dst++,src++

注:value是我所需要删除的值

091c697a948d42e8ad1210c4c81adfd3.jpg

 上图是初始化情况,创建两个变量,让他们指向数组的首地址;先判断src所指向元素是否为value(此处假设value为2),因为不是所以src++

835a3fbddd90414c8d947d070ae8acf3.jpg

 src在++以后,因为指向了value,所以应该将dst指向的数组元素覆盖,换成src当前指向的value元素;在覆盖好以后,dst需要++,同时src也需要++

d6076537810e4f29bab8dc74d48a9230.jpg

 由上图可知,src遍历完整个数组就是循环终止的条件;同时循环结束以后,dst的值恰好是value值的数量,直接返回value

记忆方法:快慢指针各创一,没碰value快++,碰到value一起加

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

上述代码解释:

先创建了两个变量,分别赋值为0(因为数组下标从0开始);while语句的结束条件是src越界,while语句里两种情况,一种是碰到value,一种没碰到(上文已经讲解过);最后返回dst,即value值个数

89b1a2efc7804025881b4986ce541a40.png

 

 

二.合并两个有序数组

7b2c708fac134ec6a88f83b22fba06ee.png 

对于本题,共有两种思路:

思路一:将nums2中数组依次放入到num1数组的后面,用排序算法对nums1进行排序(效率低下)

思路二:三指针,从后往前比较,比谁大,谁大谁往后放,l1和l2比较,谁大谁往l3放,放完的那个向前移动一位,l3也向前移动一位;并且如果L1先出循环,nums2中剩余数据应该存放到nums1中

2fa6cfeca67242ac9d21f19797ac9945.jpg

 创建三个变量,一个指向nums1数组的末端,一个指向nums1元素的末端,一个指向nums2数组的末端;如上图,l2>l1,因此l3所指向的位置存放6,存放完以后l3向前移动一位,l2向前移动一位,l1不动,以此类推

28887b6f163d4289b3f2b60d785066bc.jpg

 在l2走出数组以后,nums1数组已经完成了合并与排序工作;通过上图我们也不难发现,l1如果没有走出数组,但l2走出了数组,这种情况下已经完成了操作;这是因为l1中小的元素要比l2最小的首地址元素还要小,且l1作为有序数组,小的元素已经排好序了,因此不需要动

0833d3705bab4a28aaec45bad39273ec.jpg

 对于这种情况,l1>l2,因此l3指向的内容存放6;存放完l1往前移动一位,l3往前移动一位,l2不动,以此类推

a75c4453696c4350a54d6efce27d9622.jpg

 可是这种情况,在l1走出循环以后,nums2数组里依旧有一个数字1并未存放到nums1数组中;这时就需要循环语句讲nums2中的剩余元素合并到nums1数组中,请注意l2和l1一起减一的关系不变

记忆方法:两个指最后,一个指当中;最后当中比大小,谁大谁放最后;大的指向要--,存放位置也--;若没存放完,循环语句放进去,--关系不能变

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int l1 = m - 1;     // nums1[]已经存放好的元素
    int l3 = m + n - 1; // nums1[]的总长度
    int l2 = n - 1;     // nums2[]存放的元素

    while (l1 >= 0 && l2 >= 0) {
        if (nums1[l1] < nums2[l2]) {
            nums1[l3--] = nums2[l2--];
        } else {
            nums1[l3--] = nums1[l1--];
        }
    }
    while (l2 >= 0) {
        nums1[l3--] = nums2[l2--];
    }
}

 上述代码解释:

创建三个变量,分别指向三个位置;while语句,分l1>l2和l1<l2两种情况;--是后置--,先使用后--;循环结束以后如果nums2里还有数据没存放,循环语句放进去

47b58e4cab8340c8a16bf85094e7ad3f.png 

 

 

 

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

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

相关文章

用Cmake编译程序时,链接到FFmpeg库

用Cmake编译程序时&#xff0c;链接到FFmpeg库 一、前言 可喜可贺&#xff0c;折腾了一晚上终于把这个勾八链接成功了&#xff0c;已经要吐了。看到下面控制台的输出&#xff0c;吾心甚慰呀&#x1f62d; [100%] Linking CXX executable rknn_yolov5_demo [100%] Built targe…

[数据结构]——排序——插入排序

目录 ​编辑 1 .插入排序 1.基本思想&#xff1a; 2.直接插入排序&#xff1a; ​编辑 1.代码实现 2.直接插入排序的特性总结&#xff1a; 3.希尔排序( 缩小增量排序 ) 1.预排序 2.预排序代码 3.希尔排序代码 4.希尔排序的特性总结&#xff1a; 1 .插入排序 1.基本思…

C语言联合体详解

下午好诶&#xff0c;今天小眼神给大家带来一篇C语言联合体详解的文章~ 目录 联合体 1. 联合体类型的声明 2. 联合体的特点 代码一&#xff1a; 代码二&#xff1a; 3. 相同成员的结构体和联合体对比 ​编辑4. 联合体大小的计算 5. 联合体的优点 联合体 1. 联合体…

电脑显示缺失d3dx9_43.dll文件如何修复?分享5种详细的修复方法

在日常使用计算机的过程中&#xff0c;当我们尝试启动某个软件或运行一款游戏时&#xff0c;系统可能会弹出一个错误提示信息&#xff0c;明确指出“d3dx9_43.dll文件缺失”。这个情况表明&#xff0c;作为Windows操作系统中不可或缺的一部分&#xff0c;DirectX 9.0c的一个关键…

数电期末复习(二)逻辑代数基础

这里写目录标题 2.1 二值逻辑变量与基本逻辑运算2.1.1 与运算2.1.2 或运算2.1.3 非运算2.1.4 常用复合逻辑运算 2.2 逻辑函数的建立及其表示方法2.2.1 真值表表示2.2.2 逻辑函数表达式表示2.2.3 逻辑图表示方法2.2.4 波形图表示方法 2.3 逻辑代数2.3.1 逻辑代数的基本定律和恒等…

MySQL数据库基础知识(数据库/表的基础操作 + 基本类型)

文章目录 数据库的操作显示当前数据库服务器上有哪些数据库创建数据库使用数据库删除数据库 常用数据类型数值类型字符串类型日期类型小结(主要使用) 表的操作创建表查看表结构列出当前数据库的表删除表 注释MySQL创建的数据库/表存储在系统的位置 数据库的操作 输入的单词之间…

算法入门——二分查找

目录 1、二分模板 2、习题 1.704.二分查找 2.35.搜索插入位置 3.744. 寻找比目标字母大的最小字母 4.69. x 的平方根 5.1351. 统计有序矩阵中的负数 6.74. 搜索二维矩阵 7.34. 在排序数组中查找元素的第一个和最后一个位置 8.33. 搜索旋转排序数组 9.153. 寻找旋转排…

政企版 WPS Pro 专业版注册安装教程

政企版 WPS Pro 专业版安装及激活步骤 第 1 步&#xff1a;下载压缩包&#xff08;内含注册码&#xff09;【无解压密码】。 第 2 步&#xff1a;解压缩后&#xff0c;运行 exe 文件&#xff0c;默认步骤安装即可。 第 3 步&#xff1a;安装完成后&#xff0c;新建一个 Word …

【ThinkPHP框架教程·Part-04】URL访问模式

文章目录 一、URL解析1、URL解析格式2、URL解析示例说明3、设置URL重写 二&#xff0e;URL 兼容模式 本章节我们来简单了解一下 ThinkPHP6.0 的 URL 访问模式&#xff0c;解析它的访问方法。 一、URL解析 ThinkPHP 框架非常多的操作都是通过 URL 来实现的。 1、URL解析格式 由…

利用RFID无线射频技术,实现商品防伪和溯源信息管理

近几年来&#xff0c;伴随着信息化产业的快速发展&#xff0c;企业对于产品在生产、流通、分销和零售等环节的实时跟踪和监管的需求日趋强烈。同时企业在经营过程中不可避免地要在不同区域实行差异化的经销商拿货价格&#xff0c;从而导致窜货现象时有发 生&#xff0c;为企业带…

二叉树链式结构的实现-二叉树的前序 中序 后序 层序遍历

一、二叉树的结构了解 二叉树是&#xff1a; 空树非空&#xff1a;根节点&#xff0c;根节点的左子树、根节点的右子树组成的。 前序&#xff1a; 根 左子树 右子树 --》先根 中序&#xff1a;左子树 根 右子树 --》中根 后序&#xff1a;左子树 右子树 根 --》后根 层序&…

命理八字之答案之书前端uniapp效果实现

#uniapp# #答案之书# 不讲废话&#xff0c;先上截图 <div class"padding"><div class"flex align-center justify-center" style"padding-top:100px;"><div class"radarContainer"><div id"radarBox"…

C#医学实验室/检验信息管理系统(LIS系统)源码

目录 检验系统的总体目标 LIS主要包括以下功能&#xff1a; LIS是集&#xff1a;申请、采样、核收、计费、检验、审核、发布、质控、耗材控制等检验科工作为一体的信息管理系统。LIS系统不仅是自动接收检验数据&#xff0c;打印检验报告&#xff0c;系统保存检验信息的工具&a…

关于Android绘制这一遍就够了

Android绘制基础 Android平台提供了一套完整的UI框架&#xff0c;其中包括了绘制组件和绘制API。在Android中&#xff0c;绘制主要涉及到两个核心概念&#xff1a;Canvas和Paint。 Canvas Canvas是Android中的一个类&#xff0c;它代表了绘图的画布。你可以在这个画布上进行…

CAS Client使用以及执行原理

CAS Client使用以及执行原理 流程介绍 CAS Client是利用Java Web中的Filter进行实现认证功能&#xff0c;客户端对CAS Server的认证流程分为以下步骤&#xff1a; 访问CAS Client服务 由于当前session中未检测到认证信息&#xff0c;会重定向到CAS Server地址进行认证 在CA…

11.Ribbon负载均衡策略及修改

ZoneAvoidanceRule 默认使用的规则 修改规则 第一种方式&#xff1a;定义IRule的Bean,作用于全局。 SpringBootApplication MapperScan("com.xkj.org.mapper") public class OrderApplication {public static void main(String[] args) {SpringApplication.run(Ord…

设计模式——2_A 访问者(Visitor)

文章目录 定义图纸一个例子&#xff1a;如何给好奇宝宝提供他想知道的内容菜单、菜品和配方Menu(菜单) & Cuisine(菜品)Material(物料、食材) 产地、有机蔬菜和卡路里Cuisine & Material 访问者VisitorCuisine & Material 碎碎念访问者和双分派访问者和代理写在最后…

C#基础|StringBuilder字符串如何高效处理。

哈喽&#xff0c;你好&#xff0c;我是雷工。 字符串处理在C#程序开发中是使用频率比较高的&#xff0c;但常规的字符串处理方式对内存占用比较多&#xff0c;为了优化内存&#xff0c;减少不必要的内存浪费&#xff0c;引入了StringBuilder类。 下面学习下StringBuilder类的使…

插入排序动态展示3(Python可视化源代码)

修改了“开始”命令按钮&#xff0c;每次单击“开始”&#xff0c;都重新排序。 Python代码 import tkinter as tk import random import timeclass InsertionSortVisualizer:def __init__(self, root, canvas_width800, canvas_height400, num_bars10):self.root rootself.…

wasm 系列之 WebAssembly 和 emscripten 暴力上手

wasm 是什么&#xff1f; wasm 是 WebAssembly 的缩写。wasm 不是传统意义上的汇编语言&#xff0c;而是一种编译的中间字节码&#xff0c;可以在浏览器和其他 wasm runtime 上运行非 JavaScript 类型的语言&#xff0c;只要能被编译成 wasm&#xff0c;譬如 kotlin/wasm、Rus…