解剖—顺序表相关OJ练习题
目录
一、删除有序数组中的重复项,返回出现一次元素的个数。
二、原地移除数组中所有数值等于val的元素
三、合并两个有序数组
四、旋转数组
五、数组形式的整数加法
一、删除有序数组中的重复项,返回出现一次元素的个数。
26. 删除有序数组中的重复项 - 力扣(LeetCode)
给你一个 非严格递增排列 的数组
nums,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums中唯一元素的个数。数组大小numsSize已给出。考虑
nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。- 返回
k。
int removeDuplicates(int* nums, int numsSize) {int src = 1;int dst = 0;while (src < numsSize) {if (nums[src] == nums[dst])src++;elsenums[++dst] = nums[src++];}return dst + 1;
}
思路:采用双指针一前一后
1、src负责寻找与当前dst相等的值,dst负责修改数组。

2、如果src等于dst,则src向后移动一位,向后寻找不相同的值

3、如果src不等于dst,则dst向后移动一位,将src的值赋值给dst,src向后移动一位继续循环比较后项元素。

4、src指向数组最后一个元素时,比较后src大于数组大小numsSize时停止循环。

5、返回值为新数组的大小dst+1。
二、原地移除数组中所有数值等于val的元素
27. 移除元素 - 力扣(LeetCode)
给你一个数组
nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移后数组的新长度。不要使用额外的数组空间,你必须仅使用
O(1)额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
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++];elsesrc++;}return dst;
}
思路:采用双指针
src负责寻找值为val的位置,dst负责修改数组。假设当前val等于7。
1、如果src不等于val,则dst赋值为src,然后整体向后移动。

2、如果src等于val(dst也等于val),src向后移动一位。

3、再次判断时src不等于val,dst(当前为val)被赋值为src(val后一项)。成功删除数组元素val。

4、删除后dst和src均向后移动一位 。

5、之后在数组中依次查找,没有等于val的元素则将src赋值给dst(后项值一次赋值给前项),赋值后二者向后移动一位。
结果如下:

6、最终返回数组长度dst。
三、合并两个有序数组
88. 合并两个有序数组
给你两个按 非递减顺序 排列的整数数组
nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你 合并
nums2到nums1中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6]
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int end1 = m - 1;int end2 = n - 1;int i = m + n - 1;while (end1 >= 0 && end2 >= 0) {if (nums2[end2] > nums1[end1])nums1[i--] = nums2[end2--];else {nums1[i--] = nums1[end1--];}}while (end2 >= 0)nums1[i--] = nums2[end2--];
}
思路:三指针法
假设合并这两个数组:

1、定义 end1 和 end2 分别为数组 num1 和 num2 的最后一个元素下标,定义 i 为合并后num1新的最后一个元素下标.

2、因为是递增数列,所以我们从后向前先比较两个数组最后一个元素 (最大元素) 的大小。
大的元素赋值给数组num1尾节点,然后将 i、end1和end2向前移动一位继续比较。

3、如果end2位置元素不大于end1位置元素,则将end1位置元素赋值给 i 位置,end1和 i 向前移动一位。

4、最后end1已将小于零时,end2还等于0,证明数组num2中还有未合并的元素且该元素小于num1中最小元素(首元素)。

5、我们通过第二个循环将数组num2中小于num1最小元素的元素赋值到num1剩余位置,end2小于零时赋值结束。

当然也可以使用qsot排序做这道题,但时间复杂度为O(nlogn)大于上述解法的O(m+n)。
所以综合考虑推荐三指针法!!!
四、旋转数组
189. 轮转数组 - 力扣(LeetCode)
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4]解释: 向右轮转 1 步:[7,1,2,3,4,5,6]向右轮转 2 步:[6,7,1,2,3,4,5]向右轮转 3 步:[5,6,7,1,2,3,4]
void reserve(int* a, int left, int right)
{while (left < right) {int tmp = a[left];a[left] = a[right];a[right] = tmp;left++;right--;}
}
void rotate(int* nums, int numsSize, int k) {if (k > numsSize)k %= numsSize;reserve(nums, numsSize - k, numsSize - 1);reserve(nums, 0, numsSize - k - 1);reserve(nums, 0, numsSize - 1);
}
思路:使用三次逆转法,让数组旋转k次
- 逆转子数组[numsSize - k, numsSize - 1]
- 逆转子数组[0, numsSize - k - 1]
- 整体逆转[0,numsSize - 1]
假设轮转次数k为3
1、首先写出逆转数组的函数reserve,逆置的原理就是依次交换首尾元素。

2、然后找到要逆转的数组对应部分进行逆转。

3、 逆转过程如下:

五、数组形式的整数加法
989. 数组形式的整数加法 - 力扣(LeetCode)
整数的 数组形式
num是按照从左到右的顺序表示其数字的数组。
- 例如,对于
num = 1321,数组形式是[1,3,2,1]。给定
num,整数的 数组形式 ,和整数k,返回 整数num + k的 数组形式 。示例 1:
输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234
int* addToArrayForm(int* A, int ASize, int K, int* returnSize) {int* addRet = (int*)malloc(10001 * sizeof(int));//reti: 第i位的结果int reti = 0;//从低位开始相加int ai = ASize - 1;int next = 0; // 进位值while (ai >= 0 || K > 0){int x1 = 0;//如果ai没有越界,还有未相加的位,取出一位存入x1if (ai >= 0){x1 = A[ai];--ai;}int x2 = 0;//如果k大于0,获取k的第i位if (K > 0){x2 = K % 10;K /= 10;}//第i位的结果:每一位的值 + 进位int ret = x1 + x2 + next;//如果结果大于9,需要进位if (ret > 9){ret %= 10;next = 1;}else{next = 0;}//存入第i位的结果到数组中addRet[reti++] = ret;}//如果最高位有进位,需要在存入1if (next == 1){addRet[reti++] = 1;}//逆置结果reverse(addRet, 0, reti - 1);*returnSize = reti;return addRet;
}
思路:模拟加法进行逐位相加, 从低位向高位相加,最后整体逆置,得到最终结果
1、定义一个整数数组
addRet用于存储相加的结果。数组的大小设为10001,足够容纳可能的最大结果。定义变量
reti,表示结果数组的当前索引,初始化为0。定义变量
ai,表示数组A的当前索引,初始化为ASize - 1,即数组A的最高索引。定义变量
next,表示进位值,初始化为0。int* addRet = (int*)malloc(10001 * sizeof(int)); int reti = 0; int ai = ASize - 1; int next = 0;
2、使用循环处理每一位的相加,循环条件是
ai >= 0或K > 0,即数组A还有位数未相加,或者K还有位数未相加。while (ai >= 0 || K > 0)
3、在循环内部,首先获取
A数组当前位的值x1,如果ai没有越界,就取出对应位置的值,并将ai减1。int x1 = 0; if (ai >= 0) {x1 = A[ai];--ai; }
4、获取整数
K的当前位值x2,如果K大于0,就取出K的最低位,同时将K除以10,以准备处理下一位。int x2 = 0;if (K > 0){x2 = K % 10;K /= 10;}
5、计算当前位的结果
ret,是x1、x2和之前的进位next三者之和。如果结果大于9,表示需要进位,就对结果取模10,然后将next设置为1;否则,next设置为0。int ret = x1 + x2 + next; if (ret > 9) {ret %= 10;next = 1; } else {next = 0; }
7、将计算得到的
ret存入结果数组addRet的当前位置reti,递增reti,以准备处理下一位。addRet[reti++] = ret;
8、循环结束后,检查最高位是否有进位。如果
next为1,表示有进位,因此将1存入结果数组的当前位置reti。if (next == 1){addRet[reti++] = 1;}
9、调用
reverse函数来逆置结果数组addRet,以得到正确的结果顺序。reverse(addRet, 0, reti - 1);
最后,将结果数组的大小
reti赋值给returnSize指向的变量,以告知结果数组的大小。返回结果数组
addRet,它包含了相加的结果。*returnSize = reti; return addRet;
相关文章:
解剖—顺序表相关OJ练习题
目录 一、删除有序数组中的重复项,返回出现一次元素的个数。 二、原地移除数组中所有数值等于val的元素 三、合并两个有序数组 四、旋转数组 五、数组形式的整数加法 一、删除有序数组中的重复项,返回出现一次元素的个数。 26. 删除有序数组中的重…...
NAT网关在阿里云的应用
NAT网关(Network Address Translation Gateway)是一种网络地址转换服务,提供NAT代理(SNAT和DNAT)能力。NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决I…...
操作系统体系结构和OS
1.冯诺依曼计算机体系 关于冯诺伊曼系统,在这里我只是简单讲一讲,更加详细的内容可以看我的计算机组成系列。 常见的笔记本、台式机,不常见的服务器、工作站,大部分都遵守“冯诺依曼体系”,因此该计算机体系就是现代…...
Flutter ☞ 常量
常量 只能被定义一次,并且不可修改的值叫做常量。 在 Flutter 中有两种常量修饰方法 finalconst 相同点 类型声明可以省略 final String a 123; final a 123;const String a 123; const a 123;初始化后不能再赋值 final a 123; a abc; // 错误const a …...
C++ 配置VSCode开发环境
C配置VSCode开发环境 简介 Visual Studio Code (VSCode) 是一款开源的轻量级代码编辑器。它支持许多编程语言,包括C。本文档将详细介绍如何在Windows环境下配置VSCode的C开发环境。 安装步骤 1. 安装Visual Studio Code 首先,你需要下载并安装Visua…...
Arduino_STM32整理贴
Arduion-STM32 stm32duino 让stm32 在arduino中使用 源代码:https://github.com/stm32duino/Arduino_Core_STM32 busybox文件位置 stm32duino 下有个stm32tool 项目,内含有busybox.exe 使用usb转TTL烧写 使用 PA9 PA10 端口 PA9接 RX ,PA10接 TX …...
MoeCTF 2023 Web+Jail wp
----------签到---------- hello CTFer 给了一个URL,是赛博厨子解码base64的flag,flag直接给了。 远程端口转发: 这次比赛估计好多大师傅都没参加,题目环境是在本机内网上的(比如localhost:52005)导致请…...
494.目标和 474.一和零
目标和 题目 给一个都是正整数的组合,然后你可以在里面任意添加或-,求使得最后结果为 目标和S(target)的有多少种方法? 范围 数组非空,且长度不会超过 20 。初始的数组的和不会超过 1000 。保证返回的…...
模拟电源与数字电源之间的区别
BOSHIDA 模拟电源与数字电源之间的区别 模拟电源与数字电源是两种不同的电源类型,其核心区别在于电源控制方式和输出特性。本文将从这两方面对模拟电源和数字电源进行比较和分析。 电源控制方式: 模拟电源的控制方式以模拟电压和模拟电流为基础。模拟电…...
P5461 赦免战俘
题目描述 现有 2 n 2 n ( n ≤ 10 ) 2^n\times 2^n (n\le10) 2n2n(n≤10) 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵…...
【工具】转码silk格式为mp3
【工具】转码slk格式为mp3 前提 安装 ffmpeg 【安装】Linux安装ffmpeg_linux安装ffmpeg4.4_我是Superman丶的博客-CSDN博客 GitHub - kn007/silk-v3-decoder: [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to o…...
蓝桥杯每日一题2023.10.18
题目描述 特别数的和 - 蓝桥云课 (lanqiao.cn) 题目分析 简单枚举每一个可行的数 #include<bits/stdc.h> using namespace std; int flag, ans; int main() {int n;cin >> n;for(int i 1; i < n; i ){flag 0;int x i;while(x){int y x % 10;if(y 2 || y…...
大数据开发中的秘密武器:探索Hadoop纠删码的奇妙世界
随着大数据技术的发展,HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了系统的可靠性,HDFS通过复制来实现这种机制。但在HDFS中每一份数据都有两个副本,这也使得存储利用率仅为1/3,每TB数据都需要占用3TB的存储空间。因此&…...
华为数通方向HCIP-DataCom H12-831题库(单选题:301-310)
第301题 关于配置防火墙安全区域的安全级别的描述,错误的是 A、同一系统中,两个安全区域不允许配置相同的安全级别 B、只能为自定义的安全区域设定安全级别 C、安全级别一旦设定不允许更改 D、新建的安全区域,系统默认其安全级别为1 答案:D 解析: 新创建的安全区域缺省未…...
Vite 踩坑 —— require is not defined
动态require引入图片报错 require 是属于 Webpack 的方法,而我使用的是 Vite,所以我们需要去寻找 Vite 静态资源处理的方法 所以,我们只需要将代码改写以下形式即可。 template <CarouselItem v-for"(item,index) of carous…...
彻底理解操作系统与内核的区别!
通用底盘技术 Canoo公司有一项核心技术专利,这就是它们的通用电动底盘技术,长得是这个样子,非常像一个滑板: 这个带轮子、有电池、能动的滑板已经包含了一辆车最核心的组件,差的就是一个外壳。这个看起来像滑板的东西…...
微信小程序4
一自定义组件应用 1.介绍 微信小程序自定义组件是指开发者可以自定义组件,将一些常用的 UI 元素封装成一个自定义组件,然后在多个页面中复用该组件,实现代码复用和页面性能优化的效果。 2.自定义组件分为两种类型 组件模板类型:…...
OpenCV14-图像平滑:线性滤波和非线性滤波
OpenCV14-图像平滑:线性滤波和非线性滤波 1.图像滤波2.线性滤波2.1均值滤波2.2方框滤波2.3高斯滤波2.4可分离滤波 3.非线性滤波3.1中值滤波3.2双边滤波 1.图像滤波 图像滤波是指去除图像中不重要的内容,而使关心的内容表现得更加清晰的方法,…...
kafka_2.10启动Kafka broker
要启动 Kafka broker,你需要执行以下步骤: 首先,确保你已经安装了 Kafka。你可以从 Apache Kafka 的官方网站下载 Kafka 的二进制发行版,并按照官方文档中的说明进行安装。 在安装完成后,进入 Kafka 的安装目录。 打…...
【配置环境】SQLite数据库安装和编译以及VS下C++访问SQLite数据库
一,环境 Windows 11 家庭中文版,64 位操作系统, 基于 x64 的处理器SQLite - 3.43.2Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.5.3 二,SQLite简介 简要介绍 SQLite(Structured Query Language for Lite&a…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
