经典LeetCode在线OJ习题

news2024/11/14 18:26:09

目录

习题一:移除元素

(一)、题目

 (二)、示例

(三)、解题思路

思路一:

思路一源代码:

源代码解释:

思路二:(最标准最适用)

思路二源代码:

源代码解释:

 习题二:归并两个有序数组

(一)、题目

 (二)、示例

(三)、解题思路

 思路一:暴力求解但效率堪忧

思路二:

思路二步骤示意图:

思路二源代码:

源代码解释:


习题一:移除元素

(一)、题目

 (二)、示例

(三)、解题思路

该题小编一共给出两种思路:

思路一:

从最后一个元素开始从尾到始遍历数组,若找到val值,就与最后一个数交换,同时数组长度减1,第二次找到val值,就与倒数第二个数交换,以此类推,直到遍历完数组。

思路一源代码:
int removeElement(int* nums, int numsSize, int val)
{
	int i = 0;
	int j = numsSize - 1;
	int k = numsSize - 1;
	for (i = j; i >= 0; i--)
	{
		if (nums[i] == val)
		{
			int tmp = nums[i];
			nums[i] = nums[j];
			nums[j] = nums[i];
			j--;
			numsSize--;
		}
	}
	return numsSize;
}
源代码解释:

①:因为是力扣在线OJ,所以我们只需完成该函数部分,其中函数参数中:

nums为该数组首地址。

numsSize为该数组大小。

val为要删除的值。

②:最后返回numsSize是因为力扣系统会根据你返回的数组大小遍历一次数组,看是否删除元素val值。

③:首先我们根据思路将两个变量赋值相应的值,整型数组末尾元素的下标即为数组大小减一。

④:然后用一个for循环遍历数组,用if判断语句来判断该值是否等于val值,若等于,则与最后一个元素交换值,然后数组大小numsSize-1,最后遍历完数组,返回numsSize即可。

思路二:(最标准最适用)

用两个变量来控制下标:一个变量str用于遍历数组,进行判断是否等于val值;另一个变量dst用于存储值,当str下标对应的值不等于val值时,就将str下标对应的值赋值给dst下标对应的位置,然后dst++,最后dst就为新数组的大小,返回dst即可。

思路二源代码:
int removeElement(int* nums, int numsSize, int val) {
    int str = 0, dst = 0;
    while (str < numsSize)
    {
        if (nums[str] != val)
        {
            nums[dst++] = nums[str++];
        }
        else
        {
            str++;
        }
    }
    return dst;
}
源代码解释:

①:先创建两个变量用于控制下标,然后用一个while循环遍历数组,又因为numsSize不会变,str会依次++,所以循环条件为(str<numsSize)。

②:每一次循环都判断一次str下标对应的值是否等于val值,若不等于,则将str下标对应的值赋给dst下标对应的位置,然后str和dst都++一次;若等于val值,则str++一次判断下一次的值。

③:当遍历完数组后,dst即为新数组大小,最后返回dst即可。

 

 习题二:归并两个有序数组

(一)、题目

 注意:非递减和递增的区别:

 (二)、示例

 

 

注意:我们看到示例1中,数组nums1 只有三个数,但却有六个空间,而数组nums2有三个数,恰好对应nums1剩余三个空间,所以这道题是说归并后全部放在数组nums1中,这就是此题难点。

(三)、解题思路

 思路一:暴力求解但效率堪忧

直接将两个数组拷贝在一起,再用qsort库函数排序即可,关于qsort的使用方法可参考http://t.csdn.cn/ThBhB

但这种方法不论是时间复杂度还是空间复杂度,效率都很低。

思路二:

将两数组从有效数字末尾处最大的数依次拿出来进行比较(为什么说是有效数字呐,因为题设要求是将数组nums1和数组nums2归并到数组nums1里面,所以nums1是有较大空间的,开始时,数组nums1除了自身待归并数组部分,剩下一部分全初始化为0,0也是数字,所以我们说需要从待排序数组的末尾处进行比较(即有效数字)),将较大的数从数组nums1末尾依次开始存放,所以两个数组都是非递减数组,所以按照此思路归并的数组也是一个非递减数组。

什么时候结束呐?根据这种思路,因为nums1是大空间,若当nums2里面的数比较完后,则全部结束;若nums1里面的数先比较完,nums2里面还有数没有比较,这时就需要将nums2里面的数放在nums1对应位置后才能全部结束。

思路二步骤示意图:

 

 

 

 

 

思路二源代码:
void merge(int* nums1, int m, int* nums2, int n)
{
    int end = m + n - 1;
    int end1 = m - 1, end2 = n - 1;
    while (end1 >= 0 && end2 >= 0)
    {
        if (nums1[end1] > nums2[end2])
        {
            nums1[end--] = nums1[end1--];
        }
        else
        {
            nums1[end--] = nums2[end2--];
        }
    }
    while (end2 >= 0)
    {
        nums1[end--] = nums2[end2--];
    }
}
源代码解释:

①:因为这是力扣在线OJ习题,所以我们只需完成函数体部分,并且函数参数中:

nums1为数组一的首地址(大数组);

m为数组nums1的有效元素个数;

nums2为数组二的首地址;

n为数组nums2的元素个数;

②:根据步骤示意图,我们给出三个变量,分别找到end、end1、end2的起始位置,end即两数组的有效元素个数-1,end1为m-1,end2为n-1。

③:用while循环来依次拿出数据进行比较,并且如果end1和end2大于等于0时,说明两个数组中都还有元素没有进行比较归并,比较时,end1和end2下标谁对应的数比较大,就将该数放在nums1数组以end为下标的位置处,然后相应变量进行减减,进行下一组数的比较。

④:当且仅当end1或end2小于0时,while循环结束,即某一个数组的元素已经归并完了,这时又要分情况进行:

若end2<0,即数组nums2的元素已经归并完,这时虽然数组num1中还有元素未进行比较归并操作,但我们本来就是需要将所有的数归并到数组nums1,所以当数组nums2中的元素归并完成,数组nums1中剩下的元素也是自动排序好的,所以这时程序结束;

若end1<0,即数组nums1的元素已经归并完了,这时数组nums2中还有元素未归并,而我们又需要将所有的数都归并到数组nums1,所以我们还需要将数组nums2中为排序的元素放入数组nums1的剩余位置,又因为两数组都是非递减的,所以我们只需依次存放就行,然后程序结束。

本次知识到此为止,希望对你有所帮助!

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

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

相关文章

利用metasploit生成反弹shell程序,实现远程控制

1. 关于metasploit Metasploit是一款开源的渗透测试框架&#xff0c;由Rapid7公司开发和维护。它提供了一套强大的工具和资源&#xff0c;用于评估和测试计算机系统的安全性。Metasploit的目标是帮助安全专业人员发现和利用系统中的漏洞&#xff0c;以便改进系统的安全性。 Met…

Mybatis的SqlSource SqlNode BoundSql

学习链接 MyBatis SqlSource解析 【Mybatis】Mybatis源码之SqlSource#getBoundSql获取预编译SQL Mybatis中SqlSource解析流程详解 Mybatis TypeHandler解析 图解 Mybatis的SqlSource&SqlNode - processon DynamicSqlSource public class DynamicSqlSource implement…

【leetcode 力扣刷题】哈希表初尝试

哈希表 刷题初尝试 哈希表基础知识242. 有效的字母异位词383. 赎金信49. 字母异位词分组438. 找到字符串中所有字母异位词 哈希表基础知识 哈希表是一种数据结构&#xff0c;也叫散列表。哈希表中存储的是键值对&#xff0c;即(key&#xff0c;value)&#xff0c;根据key直接查…

7-1 选择法排序

分数 20 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求将给定的n个整数从大到小排序后输出。 输入格式&#xff1a; 输入第一行给出一个不超过10的正整数n。第二行给出n个整数&#xff0c;其间以空格分隔。 输出格式&#xff1a; 在一行中输出从大到小有序…

openai多模态大模型:clip详解及使用

引言 CLIP全称Constrastive Language-Image Pre-training&#xff0c;是OpenAI推出的采用对比学习的文本-图像预训练模型。CLIP惊艳之处在于架构非常简洁且效果好到难以置信&#xff0c;在zero-shot文本-图像检索&#xff0c;zero-shot图像分类&#xff0c;文本→图像生成任务…

JAVA基础知识(五)——面向对象(中)

面向对象&#xff08;中&#xff09; 一、面向对象特征之一&#xff1a;封装与隐藏1.1 简介1.2 封装性的体现1.3 四种访问权限修饰符 二、类的成员之三&#xff1a;构造器2.1 构造器的特征2.2 构造器的作用2.3 语法格式2.4 构造器分类2.5 构造器重载2.6 属性赋值过程 三、扩展知…

Python的六种参数?

很多人说&#xff0c;Python的参数类型有四种、五种&#xff0c;我个人认为归纳起来是六种参数&#xff0c;分别为&#xff1a;位置参数&#xff08;Positional Arguments&#xff09;、默认参数&#xff08;Default Arguments&#xff09;、关键字参数&#xff08;Keyword Arg…

[C++11]

文章目录 1. 自动类型推导1.1 auto1.1.1 推导规则1.1.2 auto的限制1.1.3 auto的应用1.1.4 范围for 1.2 decltype1.2.1 推导规则1.2.2 decltype的应用 1.3 返回类型后置 2.可调用对象包装器、绑定器2.1 可调用对象包装器2.1.1 基本用法2.1.2 作为回调函数使用 2.2 绑定器 3. usi…

系统架构设计专业技能 · 信息系统基础

系列文章目录 系统架构设计专业技能 网络技术&#xff08;三&#xff09; 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 …

vue 关闭prettier警告warn

这个就是我们创建vue cli的时候 把这个给默认上了 关闭这个只需在.eslintrc.js页面里边添加一行代码"prettier/prettier": "off"

Mac OS 中JDK 环境(jdk 1.8.0_831)安装配置、环境变量配置及卸载操作

前言&#xff1a; 摊牌了&#xff0c;本来就有点喜新厌旧的我&#xff0c;特意把系统和开发环境都拉到比较高&#xff0c;想试验一下兼容性和某些新特性&#xff0c;探索了一下新大陆&#xff0c;也见识了各种光怪陆离的妖魔鬼怪。 因为要着手云平台项目的重构改版和新系统的架…

5G技术与其对智能城市、物联网和虚拟现实领域的影响

随着第五代移动通信技术&#xff08;5G&#xff09;的到来&#xff0c;我们即将迈向一个全新的数字化世界。5G技术的引入将带来更高的速度、更低的延迟和更大的连接性&#xff0c;推动了智能城市、物联网和虚拟现实等领域的发展。 首先&#xff0c;5G技术将带来超越以往的网络速…

global 可不能随便用啊!寻找1-10000内的 Spyder 数遇到的小问题,却是大思考

今天遇到这样一个问题&#xff1a;寻找1-10000内的 Spyder 数&#xff0c;Spyder 数是指&#xff0c;如果将一个数的每个位上的数字相乘&#xff0c;再将这些乘积相加&#xff0c;最终得到的和等于原始数&#xff0c;那么该数就是 Spyder 数。 逻辑分析 这个逻辑其实很简单&…

软考A计划-系统集成项目管理工程师-法律法规-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

vulnhub靶机DarkHole_2

靶机下载地址&#xff1a;DarkHole: 2 ~ VulnHub 靶机发现 arp-scan -l 扫描端口 nmap --min-rate 10000 -p- 192.168.21.145 扫描服务 nmap -sV -sT -O -p22,80 192.168.21.145 漏洞扫描 nmap --scriptvuln -p22,80 192.168.21.145 这里有git源码泄露 git clone mirrors…

浅析DIX与DIF(T10 PI)

文章目录 概述DIF与DIX端到端数据保护 DIFDIF保护类型 SCSI设备支持DIFStandard INQUIRY DataExtended INQUIRY Data VPD pageSPT字段GRD_CHK、APP_CHK、REF_CHK字段 READ CAPACITY(16)响应信息 SCSI命令请求读命令请求写命令请求 DIF盘格式化相关参考 概述 DIF与DIX DIF&…

RK3588平台开发系列讲解(AI 篇)RKNN-Toolkit2 API 介绍

文章目录 一、RKNN 初始化及对象释放二、RKNN 模型配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN-Toolkit2 API 详细说明。 一、RKNN 初始化及对象释放 在使用 RKNN Toolkit2 的所有 API 接口时,都需要先调用 RKNN()方法初始化 RKNN 对象,…

C++进阶 特殊类的设计

本篇博客介绍&#xff1a;介绍几种特殊的类 特殊类的设计 设计一个类不能被拷贝设计一个类 只能在堆上创建对象设计一个类 只能在栈上创造对象设计一个类不能被继承单例模式饿汉模式懒汉模式单例模式对象的释放问题 总结 设计一个类不能被拷贝 我们的拷贝只会发生在两个场景当…

【3D激光SLAM】LOAM源代码解析--scanRegistration.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 写在前面 本系列文章将对LOAM源代码进行讲解&#xff0c;在讲解过程中&#xff0c;涉及到论文中提到的部分&#xff0c;会结合论文以及我自己的理解进行解读&#xff0c;尤其是对于其中坐标变换的部分&…

chatGPT-对话爱因斯坦

引言 阿尔伯特爱因斯坦&#xff08; 1879年 3 月 14 日 – 1955 年 4 月 18 日&#xff09;是一位出生于德国的理论物理学家&#xff0c;被广泛认为成为有史以来最伟大、最有影响力的科学家之一。他以发展相对论而闻名&#xff0c;他还对量子力学做出了重要贡献&#xff0c;因…