面试经典 150 题——数组/字符串(一)
文章目录
- 1、合并两个有序数组
- 1.1 题目链接
- 1.2 题目描述
- 1.3 解题代码
- 1.4 解题思路
- 2、移除元素
- 2.1 题目链接
- 2.2 题目描述
- 2.3 解题代码
- 2.4 解题思路
- 3、删除有序数组中的重复项
- 3.1 题目链接
- 3.2 题目描述
- 3.3 解题代码
- 3.4 解题思路
- 4、删除有序数组中的重复项 II
- 4.1 题目链接
- 4.2 题目描述
- 4.3 解题代码
- 4.4 解题思路
- 5、多数元素
- 5.1 题目链接
- 5.2 题目描述
- 5.3 解题代码
- 5.4 解题思路
- 6、轮转数组
- 6.1 题目链接
- 6.2 题目描述
- 6.3 解题代码
- 6.4 解题思路
- 7、买卖股票的最佳时机
- 7.1 题目链接
- 7.2 题目描述
- 7.3 解题代码
- 7.4 解题思路
- 8、买卖股票的最佳时机 II
- 8.1 题目链接
- 8.2 题目描述
- 8.3 解题代码
- 8.4 解题思路
1、合并两个有序数组
1.1 题目链接
点击跳转到题目位置
1.2 题目描述
给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你合并 nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。
**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
提示:
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- -109 <= nums1[i], nums2[j] <= 109
1.3 解题代码
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int i = m - 1; int j = n - 1;int index = m + n - 1;while(i >= 0 && j >= 0){if(nums1[i] > nums2[j]){nums1[index] = nums1[i];--i;} else{nums1[index] = nums2[j];--j;}--index;}while(j >= 0){nums1[index] = nums2[j];--index;--j;}}
}
1.4 解题思路
- 使用双指针来解决该问题。
- 因为是原地修改,nums1数组后面为空,又因为nums1数组和nums2数组都是按照非递减排序的,所以可以通过逆序遍历的方式获取每个数组中的当前最大的元素。
- 添加数组时,从nums1的m+n-1位置开始添加,每次都比较nums1和nums2中的最大元素即可。
- 如果nums1没遍历完就保持原状即可,如果nums2没遍历完,还需要将nums2中的剩余元素放在nums1中。
2、移除元素
2.1 题目链接
点击跳转到题目位置
2.2 题目描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
提示:
- 0 <= nums.length <= 100
- 0 <= nums[i] <= 50
- 0 <= val <= 100
2.3 解题代码
class Solution {public int removeElement(int[] nums, int val) {int i = 0;int j = 0;int n = nums.length;int ret = 0;while(j < n){if(nums[j] != val){nums[i] = nums[j];++i;++ret;}++j;}return ret;}
}
2.4 解题思路
- 使用双指针来解决问题
- 一个指针用来遍历数组,判断当前数组是否等于val,如果不等于则需要存放进nums数组中。另一个指针作为存放下标,来存放需要存放的元素。
- 最后返回存放的数字量即可。
3、删除有序数组中的重复项
3.1 题目链接
点击跳转到题目位置
3.2 题目描述
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
- 返回 k 。
提示:
- 1 <= nums.length <= 3 * 104
- -104 <= nums[i] <= 104
- nums 已按 非严格递增 排列
3.3 解题代码
class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;int idx = 0;int i = 0;int j = 0;while(i < n){if(i == n - 1){nums[idx] = nums[i];++i;++idx;} else{j = i + 1;while(j < n && nums[j] == nums[i]){++j;}nums[idx] = nums[j - 1];idx++;i = j;}}return idx;}
}
3.4 解题思路
- 使用双指针来解决问题
- 用idx从0开始更新数组,一个指针用来遍历数组,另一个指针负责来遍历该指针所在的位置,记录当前的数为num,右边所有相同的数,直到遍历到不等于num,将num放在idx的位置,然后更新idx和左端指针。
- 最后根据idx返回nums 中唯一元素的个数。
4、删除有序数组中的重复项 II
4.1 题目链接
点击跳转到题目位置
4.2 题目描述
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
提示:
- 1 <= nums.length <= 3 * 104
- -104 <= nums[i] <= 104
- nums 已按升序排列
4.3 解题代码
class Solution {public int removeDuplicates(int[] nums) {int n = nums.length;int idx = 0;int i = 0;int j = 0;while(i < n){if(i == n - 1){nums[idx] = nums[i];++i;++idx;} else{j = i + 1;int num = 0;while(j < n && nums[j] == nums[i]){num++;++j;}if(num >= 1){nums[idx] = nums[j - 1];idx++;nums[idx] = nums[j - 1];idx++;} else{nums[idx] = nums[j - 1];idx++;} i = j;}}return idx;}
}
4.4 解题思路
- 与题目3思路一样,只是需要增加判断,相同的数是否大于等于2个,大于等于2个则需要往数组里面添加2次。
5、多数元素
5.1 题目链接
点击跳转到题目位置
5.2 题目描述
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
提示:
- n == nums.length
- 1 <= n <= 5 * 104
- -109 <= nums[i] <= 109
5.3 解题代码
class Solution {public int majorityElement(int[] nums) {Arrays.sort(nums);return nums[nums.length / 2];}
}
5.4 解题思路
- 先对原来的数组进行排序。
- 输出数组的中位数即为次数 大于 ⌊ n/2 ⌋ 的元素。
6、轮转数组
6.1 题目链接
点击跳转到题目位置
6.2 题目描述
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
提示:
- 1 <= nums.length <= 105
- -231 <= nums[i] <= 231 - 1
- 0 <= k <= 105
6.3 解题代码
class Solution {public void rotate(int[] nums, int k) {int n = nums.length;int[] ret = new int[n];for(int i = 0; i < n; ++i){ret[(i + k) % n] = nums[i]; }for(int i = 0; i < n; ++i){nums[i] = ret[i];}}
}
6.4 解题思路
- 使用额外数组,然后找到变换后数组的坐标j和原数组中坐标i的关系,即j = (i + k)% n。
- 最后将额外数组的值赋值给原数组即可。
7、买卖股票的最佳时机
7.1 题目链接
点击跳转到题目位置
7.2 题目描述
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
7.3 解题代码
class Solution {public int maxProfit(int[] prices) {int n = prices.length;int max_price = 0;for(int i = 1; i < n; ++i){int now_price = prices[i];prices[i] = Math.min(prices[i - 1], prices[i]);max_price = Math.max(max_price, now_price - prices[i]); } return max_price;}
}
7.4 解题思路
- 一次遍历数组,从下标为1开始遍历,每次先储存当前price为now_price。
- 接着prices[i]用来存储0~i范围内最低价格的股票,获取一个最大的盈利为now_price - prices[i]。
- 最后返回比较的结果(如果不存在盈利就返回一开始初始化的max_price = 0)。
8、买卖股票的最佳时机 II
8.1 题目链接
点击跳转到题目位置
8.2 题目描述
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
8.3 解题代码
class Solution {public int maxProfit(int[] prices) {int n = prices.length;int sum = 0;int min_price = prices[0];for(int i = 1; i < n; ++i){if(min_price < prices[i]){sum += (prices[i] - min_price);min_price = prices[i];} else{min_price = Math.min(prices[i], min_price);}}return sum;}
}
8.4 解题思路
- 使用贪心算法的思想来解决。
- 如果当天的价格比之前最低价格要高就卖出,否则就更新最低价格即可。(如果卖出就更新为当天价格)
相关文章:
面试经典 150 题——数组/字符串(一)
文章目录 1、合并两个有序数组1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、移除元素2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、删除有序数组中的重复项3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、删除有序数组中的重复项 II4.1 题目链接4.2 题…...
使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器实现可迭代式数据集
2023 年 11 月,Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元(数据集和数据加载器)的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…...
TestMAX/DFT Compiler:时序单元的类型、连接顺序和后DFT优化
相关阅读 TestMAX/DFT Compilerhttps://blog.csdn.net/weixin_45791458/category_12865937.html?spm1001.2014.3001.5482 时序单元的状态 未映射的时序单元(Unmapped Sequential Cell) 在Design Compiler读取了一个RTL设计后,Design Compiler内置的HDL Compiler工…...
CAN201 Introduction to Networking(计算机网络)Pt.3 网络层
文章目录 4.Network Layter(网络层)4.1 Overview4.2 Router(路由器)4.3 Internet Protocol4.4 IPv4 addressing4.5 NAT(network address translation,网路地址转换)4.6 IPv64.7 Generalized For…...
App Factory:简化和加速私人应用开发
App Factory是Codigger提供的一套先进的开发工具、库和API,旨在帮助开发人员在现有的软件基础上添加特定的功能或扩展。它为私人应用的创建、开发和发布提供了一整套先进的工具集、集成的相关资源库以及强大的API接口,使开发者能够在现有的Codigger架构之…...
PHP语言laravel框架中基于Redis的异步队列使用实践与原理
在 Laravel 中,基于 Redis 的异步队列是通过 Laravel 的队列系统与 Redis 服务结合来实现的。这种队列机制允许你将任务推送到队列中,并由后台工作进程异步处理这些任务。这样,你就可以将耗时的操作(如发送邮件、处理视频、数据同…...
全面Kafka监控方案:从配置到指标
文章目录 1.1.监控配置1.2.监控工具1.3.性能指标系统相关指标GC相关指标JVM相关指标Topic相关指标Broker相关指标 1.4.性能指标说明1.5.重要指标说明 1.1.监控配置 开启JMX服务端口:kafka基本分为broker、producer、consumer三个子项,每一项的启动都需要…...
kipotix4靶机实战
信息收集 1.判断靶机ip 原理:开靶机之前nmap扫一次网段,再开靶机之后扫一次,查看多出来的ip就是靶机ip ip192.168.98.1742.判断端口服务,系统版本 a.确定端口 b.-p指定端口进一步收集 c.信息筛选 1.端口:22,80,139,…...
我的秋招总结
我的秋招总结 个人背景 双非本,985硕,科班 准备情况 以求职为目的学习Java的时间大概一年。 八股,一开始主要是看B站黑马的八股文课程,背JavaGuide和小林coding还有面试鸭。 算法,250,刷了3遍左右 项目&…...
广义线性模型(GLM)全面解析
引言 广义线性模型(Generalized Linear Model, GLM)是统计学中一种重要的建模工具,它扩展了传统线性回归模型,能够处理响应变量的非正态分布和非线性关系。GLM 的灵活性和广泛的应用范围使其在金融、医学、社会科学等领域中成为数…...
C++ OCR 文字识别
一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…...
PHP实现登录和注册(附源码)
前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包,该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具,是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…...
AEO海关认证的注意事项
AEO海关认证的注意事项繁多且至关重要,企业需细致准备,确保万无一失。 首先,企业需深入研读相关政策文件,如《中华人民共和国海关注册登记和备案企业信用管理办法》及《海关高级认证企业标准》,以政策为指引࿰…...
ElasticSearch 分布式部署
一、引言 在当今大数据时代,数据呈爆炸式增长,如何高效地存储、检索数据成为了众多企业面临的关键挑战。ElasticSearch 作为一款强大的分布式搜索引擎,凭借其卓越的性能、灵活的扩展性以及强大的全文检索能力,在日志分析、数据分…...
Vue中动态样式绑定+CSS变量实现切换明暗主题功能——从入门到进阶
1.直接借助Vue的动态绑定样式绑定 Vue动态样式绑定 在Vue中,动态样式绑定是一种强大的功能,它允许开发者根据数据的变化动态地更新元素的样式。以下是对Vue动态样式绑定的详细知识梳理与详解: 一、基础知识 Vue的动态样式绑定主要通过v-b…...
vue3 video 播放rtmp视频?(360浏览器支持)
** 注意:目前只能在360浏览器播放rtmp视频** 谷歌浏览器不支持Flash Player的问题 试过上面这个方法,目前没能实现(没解决),如果有更好的解决方法,告诉我一下 需要下载版本较低的video.js版本库࿰…...
RK356x bsp 7 - PCF8563 RTC调试记录
文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件:飞凌ok3568-c开发板 软件:原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…...
定义Shape:打造属于你的独特图形
自定义Shape:打造属于你的独特图形 在Android开发中,自定义图形绘制是一个非常重要的技能,尤其是在需要实现复杂UI或特定设计需求时。Android提供了android.graphics.drawable.shapes包,其中包含了一些基本的形状类,如RectShape、OvalShape等。然而,有时这些基本形状无法…...
JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介
1. 基本概念 1.1、前言 web开发: web,网页的意思,www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化! 动态 web 淘宝,几乎是所有的网站;提供给所有人看的数据始终会发生变化…...
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作,相关链接为: python学opencv|读取图像(二十)使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单,因此可以自由操作的空间也就大&#x…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...
mcts蒙特卡洛模拟树思想
您这个观察非常敏锐,而且在很大程度上是正确的!您已经洞察到了MCTS算法在不同阶段的两种不同行为模式。我们来把这个关系理得更清楚一些,您的理解其实离真相只有一步之遥。 您说的“select是在二次选择的时候起作用”,这个观察非…...
