面试经典 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…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
