Leetcode(经典题)day2

H指数

274. H 指数 - 力扣(LeetCode)

先对数组排序,然后从大的一头开始遍历,只要数组当前的数比现在的h指数大就给h指数+1,直到数组当前的数比现在的h指数小的时候结束,这时h的值就是要返回的结果。

排序前30615
排序后01356
h值##321
    public int hIndex(int[] citations) {Arrays.sort(citations);int i = citations.length-1;int h = 0;while(i>=0&&citations[i]>h){h++;i--;}return h;}

O(1) 时间插入、删除和获取随机元素 

380. O(1) 时间插入、删除和获取随机元素 - 力扣(LeetCode)

通过一个map和一个数组来实现

插入:map<Integer,Integer> (<值,在数组的下标>) list存值

删除:不光需要将目标值删除,还需要将删除后空出来的地方进行填补,不然后面的获取随机元素会出错。填补流程如下。

 

class RandomizedSet {private Map<Integer,Integer> map ;private List<Integer> list;public RandomizedSet() {map = new HashMap<>();list = new ArrayList<>();}public boolean insert(int val) {if(map.containsKey(val)){return false;}map.put(val,list.size());list.add(val);return true;}public boolean remove(int val) {if(!map.containsKey(val)){return false;}int a = map.get(val);int last = list.get(list.size()-1);list.set(a,last);map.put(last,a);list.remove(list.size()-1);map.remove(val);return true;}public int getRandom() {Random random = new Random();int randomNumber = random.nextInt(list.size());return list.get(randomNumber);}
}

除自身以外数组的乘积

238. 除自身以外数组的乘积 - 力扣(LeetCode) 

要求时间复杂度为O(N),且不能用除法,所以我们可以进行两次遍历,第一次遍历将每个位置左边的所有数的乘积计算出来,第二次遍历把每个位置右边的所有数的乘积计算出来,最后相乘即可。

 

public static int[] productExceptSelf(int[] nums) {int n = nums.length;int[] arr1 = new int[n];int[] arr2 = new int[n];int res = 0;arr1[0] = 1;arr2[n-1] = 1;for (int i = 1; i < n; i++) {arr1[i]=arr1[i-1]*nums[i-1];}// System.out.println(Arrays.toString(arr1));for (int i = n-2; i >= 0; i--) {arr2[i]=arr2[i+1]*nums[i+1];}// System.out.println(Arrays.toString(arr2));for (int i = 0; i < n; i++) {nums[i]=arr1[i]*arr2[i];}return nums;}

加油站

主要的两个变量,left(记录当前剩余的汽油量,用来判断起始点),sum(记录总油量是否大于耗油量),每当left<0时,则说明前边的节点都不可用,让现在节点的下一个节点作为新的起始点,并将当前剩余油量left重置为0,遍历完数组,判断sum是否小于0,是则返回-1,不是则返回现在的起始节点。

    public int canCompleteCircuit(int[] gas, int[] cost) {int n = gas.length;int left = 0;int sum = 0;int index = 0;for (int i = 0,p; i < n; i++) {p = gas[i]-cost[i];left += p;sum += p;if(left<0){left = 0;index = i+1;}}return sum < 0 ? -1 : index;}

罗马数字转整数

先写一个获取对应的字符值的方法,然后找一个变量记录前一个字符对应的值,每次比较当前字符的值与前一个字符的值的大小,分为两种情况,当前>之前,则是类似于“IV”,则结果应该减去前一个字符对应值,若当前<=之前,则对应的是类似于“II”或者“VI”,则应该加上前一个字符对应值,最后不要忘记加上最后一个字符的值。

public static int romanToInt(String s) {int res = 0;int pre = 0;pre = getnumber(s.charAt(0));int n = s.length();for (int i = 1; i < n; i++) {int index = getnumber(s.charAt(i));if (pre<index){res-=pre;}else{res+=pre;}pre = index;}res += pre;return res;}public static int getnumber(char ch){switch (ch){case 'I': return 1;case 'V': return 5;case 'X': return 10;case 'L': return 50;case 'C': return 100;case 'D': return 500;case 'M': return 1000;default: return 0;}}

整数转罗马数字

12. 整数转罗马数字 - 力扣(LeetCode)

这个没什么说的,直接看代码就好了。

public String intToRoman(int num) {StringBuilder str = new StringBuilder();while(num>=1000){str.append("M");num-=1000;}if (num>=900){str.append("CM");num-=900;}if (num>=500){str.append("D");num-=500;}if (num>=400){str.append("CD");num-=400;}while (num>=100){str.append("C");num-=100;}if (num>=90){str.append("XC");num-=90;}if (num>=50){str.append("L");num-=50;}if (num>=40){str.append("XL");num-=40;}while (num>=10){str.append("X");num-=10;}if (num>=9){str.append("IX");num-=9;}if (num>=5){str.append("V");num-=5;}if (num>=4){str.append("IV");num-=4;}while (num>=1){str.append("I");num-=1;}return str.toString();}

最后一个单词的长度

58. 最后一个单词的长度 - 力扣(LeetCode)

第一次循环找到不为' '的起点,第二次循环第一次遇到‘ ’停止。

    public int lengthOfLastWord(String s) {int count = 0;int index = s.length()-1;while (s.charAt(index)==' '){index--;}while (index>=0&&s.charAt(index)!=' '){index--;count++;}return count;}

最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode)

将第一个字符串当作公共前缀,对每个字符串进行匹配判断,如果与当前公共前缀不符,则将公共前缀长度-1,循环判断,直到当前公共前缀符合或者公共前缀长度为0。

    public String longestCommonPrefix(String[] strs) {if (strs==null||strs.length==0) {return "";}String pre = strs[0];for (int i = 1; i < strs.length; i++) {while (strs[i].indexOf(pre) !=0){pre = pre.substring(0,pre.length()-1);if (pre.length()==0){return "";}}}return pre;}

翻转字符串中的单词

151. 反转字符串中的单词 - 力扣(LeetCode)

从后向前遍历,使用双指针来确定单词的范围。

    public static String reverseWords(String s) {StringBuilder str = new StringBuilder();s = s.trim();int n = s.length();int l = n-1;int r = n-1;while (l>=0){while (l>=0&&s.charAt(l)!=' '){l--;}str.append(s.substring(l+1,r+1)+" ");while (l>=0&&s.charAt(l)==' '){l--;}r=l;}return str.toString().trim();}

找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

直接暴力解决吧,想提升可以使用KPM

    public int strStr(String haystack, String needle) {int n = haystack.length(), m = needle.length();for (int i = 0; i + m <= n; i++) {boolean flag = true;for (int j = 0; j < m; j++) {if (haystack.charAt(i + j) != needle.charAt(j)) {flag = false;break;}}if (flag) {return i;}}return -1;}

Z字形态变换

6. Z 字形变换 - 力扣(LeetCode)

使用列表,将每一行的字符加入自己所在行对应的字符串中,用一个标志量来确定方向,到头就转向。

    public String convert(String s, int numRows) {if(numRows < 2) return s;List<StringBuilder> rows = new ArrayList<StringBuilder>();for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());int i = 0, flag = -1;for(char c : s.toCharArray()) {rows.get(i).append(c);if(i == 0 || i == numRows -1) flag = - flag;i += flag;}StringBuilder res = new StringBuilder();for(StringBuilder row : rows) res.append(row);return res.toString();}

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

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

相关文章

下载安装nodejs npm jarn笔记

下载安装nodejs npm jarn笔记 下载 Node.js安装Node.js修改node全局路径安装yarn 下载 Node.js 下载Node.js 安装Node.js 双击下载的下来的.msi文件运行并安装一直点next。安装路径可以是默认也可自定义。安装完成后Node.js和npm就安装完成了 命令行输入&#xff1a; nod…

LeetCode 面试题02.04.分割链表

LeetCode 面试题02.04.分割链表 C写法 思路&#x1f914;&#xff1a; ​ 将x分为两段&#xff0c;一段放小于x的值&#xff0c;另一段放大于x的值。开辟四个指针lesshead、lesstail、greaterhead、greatertail&#xff0c;head为哨兵位&#xff0c;防止链表为空时情况过于复杂…

推荐一款 uniapp Vaptcha 手势验证码插件

插件地址&#xff1a;VAPTCHA手势验证码 - DCloud 插件市场 具体使用方式可访问插件地址自行查阅

Vue从零到实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

WEB前端03-CSS3基础

CSS3基础 1.CSS基本概念 CSS是Cascading Style Sheets&#xff08;层叠样式表&#xff09;的缩写&#xff0c;它是一种对Web文档添加样式的简单机制&#xff0c;是一种表现HTML或XML等文件外观样式的计算机语言&#xff0c;是一种网页排版和布局设计的技术。 CSS的特点 纯C…

R语言安装devtools包失败过程总结

R语言安装devtools包时&#xff0c;遇到usethis包总是安装失败&#xff0c;现总结如下方法&#xff0c;亲测可有效 一、usethis包及cli包安装问题 首先&#xff0c;Install.packages("usethis")出现如下错误&#xff0c;定位到是这个cli包出现问题 载入需要的程辑包…

永磁同步电机控制算法--基于 SVM 的无磁链环 DTC

永磁同步电机无磁链环 DTC 通过控制定子磁链交轴分量来直接控制转矩&#xff0c;不再要求控制磁链幅值恒定&#xff0c;省去了传统 DTC 中的磁链环&#xff0c;不仅转矩响应更快&#xff0c;有效抑制了转矩脉动&#xff0c;而且提高了电机功率因数。但无磁链环 DTC 方案仍采用传…

YOWOv2(yowov2)动作识别+Fastreid身份识别 详细安装与实现

首先yowov2是一款简单且实时的时空动作检测方案&#xff0c;fastreid是行人重识别&#xff08;身份识别&#xff09; yowov2介绍链接直达fastreid链接直达为时空动作检测任务设计实时框架仍然是一个挑战。YOWOv2 提出了一种新颖的实时动作检测框架&#xff0c;利用三维骨干和二…

【Js】导出 HTML 为 Word 文档

在 Web 开发中&#xff0c;有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档&#xff0c;以便更方便地分享和打印。 html样式 word文档 工具准备 1、 html-docx-js - npm html-docx-js是一个 JavaScript 库&#xff0c;用于将 HTML 内容转换为 Word 文档的格式。它…

在Linux系统实现瑞芯微RK3588部署rknntoolkit2进行模型转换

一、首先要先安装一个虚拟的环境 安装Miniconda包 Miniconda的官网链接:Minidonda官网 下载好放在要操作的linux系统,我用的是远程服务器的linux系统,我放在whl这个文件夹里面,这个文件夹是我自己创建的 运行安装 安装的操作都是yes就可以了 检查是否安装成功,输入下面…

【CEEMDAN-VMD-CNN-LSTM】双重分解+卷积神经网络+长短期记忆神经网络多变量回归预测,多变量输入模型

双重分解&#xff08;Dual Decomposition&#xff09;、卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;和长短期记忆神经网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;结合的多变量回归预测需要详细的实现和数据情况…

【香菇带你学Linux】Linux环境下gcc编译安装【建议收藏】

文章目录 0. 前言1. 安装前准备工作1.1 创建weihu用户1.2 安装依赖包1.2.1 安装 GMP1.2.2 安装MPFR1.2.3 安装MPC 2. gcc10.0.1版本安装3. 报错解决3. 1. wget下载报错 4. 参考文档 0. 前言 gcc&#xff08;GNU Compiler Collection&#xff09;是GNU项目的一部分&#xff0c;…

埋点系统如何统计用户的平均停留时长?

Hello&#xff0c;大家好&#xff0c;欢迎使用Webfunny前端监控和埋点系统。 今天&#xff0c;我们将介绍webfunny的埋点系统如何统计用户的平均停留时长 一、页面beforeLeave事件 当你页面离开的时候&#xff0c;会触发一个心跳检测&#xff0c;但是这个可能不是100%触发&am…

各向异性含水层中地下水三维流基本微分方程的推导(二)

各向异性含水层中地下水三维流基本微分方程的推导 参考文献&#xff1a; [1] 刘欣怡,付小莉.论连续性方程的推导及几种形式转换的方法[J].力学与实践,2023,45(02):469-474. 书接上回&#xff1a; 我们能得到三个方向的流入流出平衡方程&#xff1a; ∂ ρ u x ∂ x d x d y d…

Linux 下 redis 集群部署

目录 1. redis下载 2. 环境准备 3. redis部署 3.1 修改系统配置文件 3.2 开放端口 3.3 安装 redis 3.4 验证 本文将以三台服务器为例&#xff0c;介绍在 linux 系统下redis的部署方式。 1. redis下载 下载地址&#xff1a;Index of /releases/ 选择需要的介质下载&am…

【常见开发问题】阿里云无法登录的问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Python 项目】类鸟群:仿真鸟群

类鸟群&#xff1a;仿真鸟群 仔细观察一群鸟或一群鱼&#xff0c;你会发现&#xff0c;虽然群体由个体生物组成&#xff0c;但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时&#xff0c;彼此之间相互定位。受到打扰或惊吓时会破坏编队&#xf…

35 解决单条链路故障问题-华三链路聚合

InLoopBack接口是一种虚拟接口。InLoopBack接口由系统自动创建&#xff0c;用户不能进行配置和删除&#xff0c;但是可以显示&#xff0c;其物理层和链路层协议永远处于up状态。InLoopBack接口主要用于配合实现报文的路由和转发&#xff0c;任何送到InLoopBack接口的IP报文都会…

【MySQL 进阶】MySQL 程序 -- 详解

一、MySQL 程序简介 MySQL 安装完成通常会包含如下程序&#xff1a; 1、Linux 系统 程序⼀般在 /usr/bin 目录下&#xff0c;可以通过命令查看&#xff1a; 2、Windows系统 目录&#xff1a;你的安装路径\MySQL Server 8.0\bin&#xff0c;可以通过命令查看&#xff1a; 可…

树莓派PICO使用INA226测量电流和总线电压(2)

上一篇文章里&#xff0c;我们讲了如何设置配置寄存器&#xff08;0x01&#xff09;&#xff0c;在测量电流之前&#xff0c;还需要设置校准寄存器&#xff08;0x05&#xff09;&#xff0c;校准寄存器非常关键&#xff0c;如果不设置这个寄存器&#xff0c;INA226是不会工作的…