leetcode代码练习——Java的数据结构(具体使用)
注:Java中所有的泛型必须是引用类型 如<Integer>而不是<int>
java提供的数学方法:
求最大值Math.max(10,15),最小值Math.min(10,15)
看取值范围:
int范围:-2^31-2^31-1
double范围:-2^63-2^63-1
long范围:-2^63-2^63-1
-231 <= Node.val <= 231 - 1 要想有个比取值范围内都大的数double maxx=Double.MAX_VALUE
Integer.MAX_VALUE,Double.MAX_VALUE,Float.MAX_VALUE,Long.MAX_VALUE,Byte.MAX_VALUE
打印:for (Integer number : innerList) {
System.out.print(number + " ");
}
&& 符号有所谓的“短路原则”,当 A && B 出现时,如果A经判断是假,那么B表达式将不会获得执行或被判断的机会。直接结果就为假。
|| 前真后面就不去判断了,|前真后也会去判断
数组定义需要开空间,可以这样根据题目给出的大小开空间:
int s1=text1.length(),s2=text2.length();
int[][] dp=new int[s1+1][s2+1];//用定义的变量开空间
1.Map基本操作
Map<String, Integer> map这是声明Map对象指明键值对类型为String,
Map<String, Integer> map = new HashMap<>();创建一个实例并赋值给map
Map<String, List<String>> map = new HashMap<String, List<String>>();//value为一个String的列表
定义:Map<Integer,Integer> map= new HashMap<>();
添加:map.put(‘aa’,‘aaa’)
访问: map.get(‘aa’) 方法来获取 key 对应的 value:
删除:map.remove(‘aa’)
计算大小:map.size()
迭代:map.keySet()、map.values()
map.containsKey(‘aa’) 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。存在返回 true,否则返回 false。
Map<Integer,Integer> map= new HashMap<>();// 输出 key 和 valuefor (Integer i : map.keySet()) {System.out.println("key: " + i + " value: " + map.get(i));}// 返回所有 value 值for(String value: map.values()) {// 输出每一个valueSystem.out.print(value + ", ");}
1.1.map的value值转List
ArrayList<List<String>>(map.values());
HashSet(需要找是否已经包含了的时候用)
里面的元素无序,由于无序所以元素依旧是不能重复的,而且只能用for-each循环或迭代器
HashSet<String> set = new HashSet<String>();//定义
set.add("Tom");//添加
set.size();
set.isEmpty();
set.clear();//清除集合set中所有元素
boolean flag = set.contains("Tom");//将contains()判断结果赋给flag
boolean flag = set.remove("Tom");//将set集合中“Tom”元素除去并将是否成功的布尔值赋给flagfor (String name : set) {System.out.println(name);
}Iterator<String> iterator = set.iterator();//创建Iterator<>对象
while(iterator.hasNext()) {System.out.println(iterator.next());
}
2.List操作
定义:
List<String> list = new ArrayList<String>();
List<List<Integer>> ret = new ArrayList<List<Integer>>();
List<String> list = new ArrayList<String>();
//添加元素.
list.add("Tom");
list.add("Jam");
list.add("Alix");//获取元素.
String str = list.get(0);//删除元素.
list.remove(1);
list.remove("Alix");//遍历元素.
for (String s: list) {System.out.println(s);
}//判断某一个元素是否在list中
list.contains(name)//根据索引改变list中某一个值.
list.set(0, "Tom");
//返回元素值等于2的索引.
System.out.println(list.indexOf(2));//利用subList()截取, 然后给num.num = list.subList(1, 4);//判断是否为空arrayList.isEmpty()//转化成iterator对象.
Iterator it = arrayList.iterator();while(it.hasNext) {Object obj = it.next();System.out.println(obj);}
list转为String
String str = "";
str = list.toString();
list转为数组
String[] str = list.toArray();
for (String s: str) {System.out.println(str);
}
list排序功能
Arrays.sort(arr);//将字母排序
2.1 list和数组的区别
数组:
固定长度的容器,可以在其中存储同一类型的数据。数组在Java中是一个对象,可以通过索引访问其中的元素。
定义一个数组:
数据类型[] 数组名 = new 数据类型[数组长度];
int[] a = new int[5];
String str = new String[5]; str[0]='aa'; str[1]='bb';数组定义时赋值
int[] ary1 = {1,2,3};//一维数组
int next[][]={{0,1},{1,0},{0,-1},{-1,0}};//二维数组
list:
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
(1)LinkedList实现了List接口,允许null元素。LinkedList底层采用了双向链表来存储数据,每个节点都存储着上一个节点和下一个节点的地址以及本节点的数据。
此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
(2)ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList底层采用动态数组的存储方式,遍历效率非常高,ArrayList是线程不安全的。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
ArrayList和LindedList的区别:
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
总结:
1、如果涉及到堆栈、队列等操作,应该考虑使用List,对于需要快速插入、删除的元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
2、如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
3、要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
4、尽量返回接口而非实际的类型,如返回**List而非ArrayList,**这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
Java数组,List互相转换
(1)数组转换成 List 集合:
Arrays.asList(strArray) 方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。
import java.util.Arrays;// 转换数组对象
Long[] arr = new Long[]{10L, 20L, 30L};
List<Long> list1 = Arrays.asList(arr);// 转换数组常量
List<String> list2 = Arrays.asList("123", "456", "789");
要想能修改可以这种:
private void testArrayCastToListEfficient(){String[] strArray = new String[2];ArrayList< String> arrayList = new ArrayList<String>(strArray.length);//创建一个ArrayListCollections.addAll(arrayList, strArray);//把值赋过去arrayList.add("1");System.out.println(arrayList);}
(2)List 集合转数组
.toArray
// 方式1(推荐)
Long[] array = list.toArray(new Long[0]);//10L, 20L, 30L// 方式2
String[] array = (String[]) list.toArray();
2.2栈和队列
队列的实现—利用Queue接口
堆栈的实现—利用Deque接口
使用ArrayDeque类实例化队列和栈
队列:
Queue<String> queue = new LinkedList<String> ();//队列定义queue.offer("x");//增加queue.offer("u");queue.offer("e");while(!queue.isEmpty()){//判断是否为空System.out.print(queue.poll()+" ");//移除}
堆栈:
Deque<String> stack= new LinkedList<String>();//堆栈stack.push("x");stack.push("u");stack.push("e");while(!stack.isEmpty()){System.out.print(stack.pop());}
使用ArrayDeque类实例化队列和栈:
该类是Deque接口的大小可变数组的实现。数组双端队列没有容量限制;它们可根据需要增加以支持使用。它们不是线程安全的;在没有外部同步时,它们不支持多个线程的并发访问。禁止 null 元素。此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList。
操作 队列方法
插入 offer(e)
移除 poll()
检查 peek()
操作 堆栈方法
插入 push(e)
移除 pop()
检查 peek()
new一个ArrayDeque对象 既能当堆栈又能当队列。
ArrayDeque<String> stack = new ArrayDeque<String> ();stack.push("x");stack.push("u");stack.push("e");while(!stack.isEmpty()){System.out.print(stack.pop());}
3.String,char转换
String需要转char 列表
“apple”->[‘a’,‘p’,‘p’,‘l’,‘e’]
char[] arr = str.toCharArray();//将String中的字母转成char放列表里
Arrays.sort(arr);//将字母排序
char列表转String
String key = new String(arr);
charAt()方法
java中,charAt()方法用于返回指定索引处的字符。
因为String不能s[i]这样访问字符,所以只能s.charAt(i)
String s = "helloworld";
char what =s.charAt(5);//o
相关文章:
leetcode代码练习——Java的数据结构(具体使用)
注:Java中所有的泛型必须是引用类型 如<Integer>而不是<int> java提供的数学方法: 求最大值Math.max(10,15),最小值Math.min(10,15) 看取值范围: int范围:-2^31-2^31-1 double范围:-2^63-2^63-1 long范围:-2^63-2…...
sqlserver导出数据脚本
文章目录 sqlserver导出数据脚本任务-生成脚本 sqlserver导出数据脚本 任务-生成脚本...
html+css 实现hover中间展开背景
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...
Java 怎么获取支付宝Open ID
在Java中获取支付宝用户的OpenID,通常是通过支付宝的开放平台API来完成的。OpenID是支付宝用于唯一标识一个支付宝用户的字符串,它在OAuth授权流程中被用来获取用户的身份和权限。 下面我将给出一个基于Java使用Spring Boot框架和支付宝开放平台SDK来获…...
Web-server日志分析命令
https://gist.github.com/hvelarde/ceac345c662429447959625e6feb2b47 通过状态码获取请求总数 awk {print $9} /var/log/apache2/access.log | sort | uniq -c | sort –rn按照IP的请求数量排序 awk {print $1} /var/log/apache2/access.log | sort | uniq -c | sort -rn |…...
Typora的markdown笔记使用说明
个人感觉Typora是一款很适合记录编程学习的软件 目录 个人感觉Typora是一款很适合记录编程学习的软件 一、标题 二、段落 1、换行 2、分割线 三、文字显示 1、字体 2、上下标 四、列表 1、无序列表 2、有序列表 3、任务列表 五、区块显示 六、代码显示 1、行内…...
前端如何做单元测试? 看这篇就入门了
前言 对于现在的前端工程,一个标准完整的项目,通常情况单元测试是非常必要的。但很多时候我们只是完成了项目而忽略了项目测试。我认为其中一个很大的原因是很多人对单元测试认知不够,因此我写了这边文章,一方面期望通过这篇文章…...
Chainlit快速实现AI对话应用的聊天记录如何持久性保存
前言 Chainlit 可以设置聊天记录用户搜索和浏览过去的对话。 如何实现 要启用聊天历史记录,您需要启用: 数据持久性身份验证恢复对话 为了让用户继续持久对话,请使用cl.on_chat_resume 生命周期钩子 装饰器使用户能够继续对话。需要同时启用数据持久性和身份验证。 该…...
【探索数据结构与算法】——深入了解双向链表(图文详解)
目录 一、双向链表的基本概念 二、双向链表的结构 三、双向链表的基本操作实现方法 1.双向链表的初始化 2.双向链表的头插 3.双向链表的尾插 6.查找节点 7.在指定位置之前插入节点 8.删除指定位置节点 9.打印链表数据 10.双向链表销毁 四、完整代码实现 …...
linux常用命令备忘录
一、常用命令 查看被占用进程:ps ef|grep 11612 查看当前目录:pwd 查看文件的md5: (linux)md5sum 文件名 (windows)certutil -hashfile some_file MD5 查看当前目录的文件大小:…...
【C++进阶学习】第十二弹——C++ 异常处理:深入解析与实践应用
前言: 在C编程语言中,异常处理是一种重要的机制,它允许程序员在运行时捕获和处理错误或异常情况。本文将详细介绍C异常处理的相关知识点,包括异常的定义、抛出与捕获、异常处理的原则、以及在实际编程中的应用。 目录 1. 异常处理…...
《算法竞赛进阶指南》0x23剪枝
剪枝,就是减少搜索树的规模、尽可能排除搜索书中不必要的分支的一种手段。形象地看,就好像剪掉了搜索树的枝条,故被称为“剪枝”。在深度优先搜索中,有以下常见的剪枝方法。 1.优化搜索顺序 在一些搜索问题中,搜索树的…...
同态加密和SEAL库的介绍(三)BFV - Batch Encoder
写在前面: 在上一篇中展示了如何使用 BFV 方案执行一个非常简单的计算。该计算在 plain_modulus 参数下进行,并且仅使用了 BFV 明文多项式中的一个系数。这种方法有两个显著的问题: 实际应用通常使用整数或实数运算,而不是模运算…...
Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务
上一篇文章中,我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来,来使用 Traefik 的能力,进行一系列相关的基础设施搭建吧。 本篇文章,聊聊 MinIO 的单独使用,以及结合 Traefik 完成私有化 S3 服务的基础搭建…...
玛雅房产系统源码开发与技术功能解析
引言 随着房地产市场的蓬勃发展,房产管理系统(Real Estate Management System, REMS)作为提升行业效率、优化资源配置的关键工具,其重要性日益凸显。房产系统源码开发不仅涉及复杂的业务逻辑处理,还融合了先进的软件开…...
c++----初识模板
大家好,这篇博客想与大家分享一些我们c中比较好用的知识点。模板。首先咧,我们都知道模板嘛,就是以前人的经验总结出来的知识。方便我们使用。这里的模板也是一样的。当我们学习过后,对于一些在c中的自定义函数,我们在…...
SpringBoot3热部署
引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency> 默认就是,无需配置 可以了…...
J. 二进制与、平方和
https://codeforces.com/gym/104095/problem/J 分析操作一 1&00 ,0&10,ai<qmi(2,24),说明每个数最多操作25次 维护区间或和,orsum & x orsum 就不用递归下去了 势能线段树code // Problem: J. 二进制与、平方和 // Contest: Codeforc…...
LVS中NAT模式和DR模式实战讲解
1DR模式 DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT…...
写给小白程序员的一封信
文章目录 1.编程小白如何成为大神?大学新生的最佳入门攻略2.程序员的练级攻略3.编程语言的选择4.熟悉Linux5.学会git6.知道在哪寻求帮助7.多结交朋友8.参加开源项目9.坚持下去 1.编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
