LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中
目录
1.合并两个有序数组
2.移动元素
3.删除有序数组中的重复项
4.删除排序数组中的重复项 II
5.多数元素
暂时更新到这里,博主会持续更新的
1.合并两个有序数组
题目(难度:简单):
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
解法一 :
思路:先合并两个数组,然后通过冒泡排序进行排序
public void merge(int[] nums1, int m, int[] nums2, int n) { // 获取nums1数组的长度 int length1 = nums1.length; // 从nums1的有效元素末尾开始,将nums2的所有元素复制到nums1的剩余空间 for (int i = m; i < length1; i++) { nums1[i] = nums2[i - m]; } // 从nums1的开头开始,进行冒泡排序,以确保整个nums1数组是有序的 for (int i = 0; i < length1 - 1; i++) { if (nums1[i] > nums1[i + 1]) { // 如果当前元素大于其相邻的元素,则交换它们 int tmp = nums1[i]; nums1[i] = nums1[i + 1]; nums1[i + 1] = tmp; } } }
解法二:
思路:数组nums1和nums2通过比较的方式填充nums1末尾
public void merge(int[] nums1, int m, int[] nums2, int n) { // 初始化指向nums1和nums2末尾的指针 int i = m - 1; // nums1中有效数据的最后一个索引 int j = n - 1; // nums2中有效数据的最后一个索引 // 初始化指向nums1最终位置的指针 int k = nums1.length - 1; // nums1的末尾索引,也是合并后数组的末尾索引 // 当nums2中还有元素未处理时执行循环 while (j >= 0) { // 如果nums1中还有元素,并且当前nums1元素大于nums2元素 if (i >= 0 && nums1[i] > nums2[j]) { // 将nums1当前元素放到最终位置,并将指针向前移动 nums1[k--] = nums1[i--]; } else { // 否则,将nums2当前元素放到nums1的最终位置,并将指针向前移动 nums1[k--] = nums2[j--]; } } // 循环结束后,nums1包含了合并后的有序数组
}
2.移动元素
题目(难度:简单):
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解法一:
public int removeElement(int[] nums, int val) { int length = 0; // 用于记录非目标值元素的数量,也即新数组的长度 for (int i = 0; i < nums.length; i++) { // 如果当前元素不等于目标值val if (nums[i] != val) { // 将该元素移动到数组的前端(覆盖length位置上的元素) nums[length] = nums[i]; // 更新非目标值元素的数量 length++; } // 如果当前元素等于目标值val,则不做任何操作,直接跳过 } // 返回新数组的长度 return length;
}
解法二:
public int removeElement(int[] nums, int val) { // 初始化右指针j为数组末尾的索引 int j = nums.length - 1; // 遍历数组,左指针i从数组开始位置到j之前的位置 for (int i = 0; i < j; i++) { // 如果当前元素等于目标值val if (nums[i] == val) { // 交换当前元素nums[i]与右指针指向的元素nums[j] int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; // 由于已经交换了一个等于val的元素到数组末尾,所以j向左移动一位 j--; // 由于交换后当前位置的元素可能又变成了需要移除的值,所以i也需要向左移动一位 i--; } } // 返回j+1作为新数组的长度,因为j此时指向最后一个有效元素的下一个位置 return j + 1;
}
3.删除有序数组中的重复项
题目(难度:简单):
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。 - 返回
k。
解法一:
public int removeDuplicates(int[] nums) { // 使用双指针p和q,p指向当前不重复序列的末尾,q用于遍历数组 int p = 0; int q = 1; // 当q指针未到达数组末尾时执行循环 while (q < nums.length) { // 如果当前p和q指向的元素不相等,说明找到了一个新的不重复元素 if (nums[p] != nums[q]) { // 如果q和p之间的元素个数大于1,说明有多个重复元素 // 此时,将q指向的元素复制到p的下一个位置,覆盖掉多余的重复元素 if (q - p > 1) { nums[p + 1] = nums[q]; } // p指针前移一位,指向新的不重复序列的末尾 p++; } // q指针前移一位,继续遍历数组 q++; } // 返回新的数组长度,即p+1(因为p指向的是最后一个不重复元素的下一个位置) return p + 1;
}
4.删除排序数组中的重复项 II
题目(难度:中等):
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
解法一:
public int removeDuplicates(int[] nums) { // 获取数组的长度 int length = nums.length; // 初始化指针p和q // p指向新数组的最后一个已处理元素之后的位置 // q从数组的第三个元素开始遍历(索引为2) int p = 0; int q = 2; // 当q指针还没有遍历完整个数组时,继续执行循环 while (q < length) { // 如果p指针指向的元素与q指针指向的元素不同 // 说明找到了一个新的、不重复的元素 if (nums[p] != nums[q]) { // 将这个新元素复制到p指针之后的位置 // 因为p指针指向的是新数组的最后一个已处理元素之后的位置 // 所以新元素应该放在p+2的位置(因为p+1的位置是留给下一个不重复元素的) nums[p + 2] = nums[q]; // 将p指针前移一位,为下一个不重复元素腾出空间 p++; } // q指针无论如何都前移一位,继续遍历数组 q++; } // 返回新数组的长度 // 由于数组索引是从0开始的,所以新数组的长度是p+2 // 其中p是新数组的最后一个已处理元素的位置,所以p+2是新数组的长度 return p + 2;
}
5.多数元素
题目(难度:简单):
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法一:
public int majorityElement(int[] nums) { // 初始化候选元素和计数器 int candidate = nums[0]; // 将候选元素初始化为数组的第一个元素 int count = 0; // 计数器 // 遍历数组 for (int num : nums) { // 如果计数器为0,则当前元素为候选元素,并将计数器设为1 if (count == 0) { candidate = num; count = 1; } // 如果当前元素与候选元素相同,则计数器加1 else if (num == candidate) { count++; } // 如果当前元素与候选元素不同,则计数器减1 else { count--; } } // 返回候选元素,即为多数元素 return candidate; }
暂时更新到这里,博主会持续更新的
相关文章:
LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中
目录 1.合并两个有序数组 2.移动元素 3.删除有序数组中的重复项 4.删除排序数组中的重复项 II 5.多数元素 暂时更新到这里,博主会持续更新的 1.合并两个有序数组 题目(难度:简单): 给你两个按 非递减顺序 排列的…...
如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题
利用cron定时任务自动更新SSL证书后,用浏览器访问网站,获取到的证书仍然是之前的。原因在于没有对Nginx进行重启。 据说certbot更新完成证书后会自动重启Nginx,但显然经我检测不是这回事儿。 所以我们需要创建一bash脚本,然后定时调用这个脚…...
第一个 Angular 项目 - 静态页面
第一个 Angular 项目 - 静态页面 之前的笔记: [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目,目前因为还没有学到数…...
网络协议与攻击模拟_17HTTPS 协议
HTTPShttpssl/tls 1、加密算法 2、PKI(公钥基础设施) 3、证书 4、部署HTTPS服务器 部署CA证书服务器 5、分析HTTPS流量 分析TLS的交互过程 一、HTTPS协议 在http的通道上增加了安全性,传输过程通过加密和身份认证来确保传输安全性 1、TLS …...
【linux系统体验】-ubuntu简易折腾
ubuntu 一、终端美化二、桌面美化2.1 插件安装2.2 主题和图标2.3 美化配置 三、常用命令 以后看不看不重要,咱就是想记点儿东西。一、终端美化 安装oh my posh,参考链接:Linux 终端美化 1、安装字体 oh my posh美化工具可以使用合适的字体&a…...
Android 判断通知是进度条通知
1.需求: 应用监听安卓系统中的通知,需要区分出带进度条的通知. 当使用NotificationCompat.Builder构建一个通知时,可以通过调用setProgress(max, progress, indeterminate)方法来添加一个进度条。这里的max参数表示最大进度值,progress表示当前进度值&a…...
学习数据结构和算法的第8天
顺序表的实现 顺序表 本质就是数组 概念及结构 顺序表是用一段物理地址连续的储存单元依次储存数据元素的线性结构,一般情况下采用数组储存,在数组上完成数据的增删。 顺序表就是数组,但是在数组的基础上,它还要求数据…...
JCIM | MD揭示PTP1B磷酸酶激活RtcB连接酶的机制
Background 内质网应激反应(UPR) 中的一个重要过程。UPR是由内质网中的三种跨膜传感器(IRE1、PERK和ATF6)控制的细胞应激反应,当内质网中的蛋白质折叠能力受到压力时,UPR通过减少蛋白质合成和增加未折叠或错…...
基于Java (spring-boot)的音乐管理系统
一、项目介绍 播放器的前端: 1.首页:点击歌单中的音乐播放列表中的歌曲进行播放,播放时跳转播放界面,并显示歌手信息,同时会匹配歌词,把相应的歌词显示在歌词面板中。 2.暂停:当歌曲正在播放时…...
在 MacOS M系列处理器上使用 Anaconda 开发 Oralce 的Python程序
在 MacOS M系列处理器上使用 Anaconda 开发 Oralce 的Python程序 因oracle官方驱动暂无 苹果 M 系列处理器版本,所以使用Arm的python解释器报驱动错误: cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "dlop…...
四、OpenAI之文本生成模型
文本生成模型 OpenAI的文本生成模型(也叫做生成预训练的转换器(Generative pre-trained transformers)或大语言模型)已经被训练成可以理解自然语言、代码和图片的模型。模型提供文本的输出作为输入的响应。对这些模型的输入内容也被称作“提示词”。设计提示词的本质是你如何对…...
CSS之flex布局
flex布局 CSS的Flex布局(Flexible Box Layout)是一种用于在页面上布置元素的高效方法,特别适合于响应式设计。Flex布局使得元素能够伸缩以适应可用空间,可以简化很多原本需要复杂CSS和HTML结构才能实现的布局设计。 flex布局包括…...
UnityShader——02三大主流编程语言
三大主流编程语言 Shader Language Shader language的发展方向是设计出在便携性方面可以与C/JAVA相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“利用图形硬件的并行性,提高算法的效率” Shader language目前主要有 3 种语言&…...
Centos7安装nginx yum报错
Centos7安装nginx yum报错,yum源报错解决办法: 1、更新epel源后,出现yum报错 [roothacker117 ~]# yum install epel-release(安装成功) [roothacker117 ~]# yum install nginx(安装失败,提示如…...
【机组】基于FPGA的32位算术逻辑运算单元的设计(EP2C5扩充选配类)
🌈个人主页:Sarapines Programmer🔥 系列专栏:《机组 | 模块单元实验》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 一、实验目的 二、实验要求 …...
Asp .Net Core 系列:Asp .Net Core 集成 NLog
简介 NLog是一个基于.NET平台编写的日志记录类库,它可以在应用程序中添加跟踪调试代码,以便在开发、测试和生产环境中对程序进行监控和故障排除。NLog具有简单、灵活和易于配置的特点,支持在任何一种.NET语言中输出带有上下文的调试诊断信息…...
一个基于 .NET 7 + Vue.js 的前后端分离的通用后台管理系统框架 - DncZeus
前言 今天给大家推荐一个基于.NET 7 Vue.js(iview-admin) 的前后端分离的通用后台权限(页面访问、操作按钮控制)管理系统框架:DncZeus。 官方项目简介 DncZeus是一个基于 .NET 7 Vue.js 的前后端分离的通用后台管理系统框架。后端使用.NET 7 Entity Framework…...
更换商品图片日期JSON格式报错 - 序列化与反序列化日期格式设置
报错信息 msg: “服务端异常,请联系管理员JSON parse error: Cannot deserialize value of type java.util.Date from String “2023-11-13 13:13:35”: not a valid representation (error: Failed to parse Date value ‘2023-11-13 13:13:35’: Cannot parse da…...
FastJson、Jackson使用AOP切面进行日志打印异常
FastJson、Jackson使用AOP切面进行日志打印异常 一、概述 1、问题详情 使用FastJson、Jackson进行日志打印时分别包如下错误: 源码: //fastjon log.info("\nRequest Info :{} \n", JSON.toJSONString(requestInfo)); //jackson …...
嵌入式大厂面试题(2)—— 富士康
从本篇开始将会更新历年来各个公司的面试题与面经,题目来自于网上各个平台以及博主自己遇到的,如果大家有所帮助,帮忙点点赞和关注吧! 岗位:嵌入式软件工程师。 面试时间:30分钟。 岗位职责:官网…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
