刷算法心得

一、数组和集合的相互转换

当返回值是数组 / list集合 的时候,我们可以通过中间数据结构 list集合/ 数组去赞数存放数据,最后再调用工具类,转换回去。如数组转换成list ,我们可以通过Arrays.asList( 数组 );

list集合 -> 数组

如果我们要将list集合转换成数组,可以直接调用list.toArray()方法,但这通常需要使用stream流,来进行类型转换,如:

假设方法返回值是int [ ],这里IDEA编译期间就会报错,因为list存放的是Integer ,引用类型,你现在想转换成基本类型int 。

        List<Integer> list = new ArrayList<>();int[] a = new int[10];list.toArray(a);

 方法1:

我们可以通过stream流:

将list中每个元素转换成int,然后调用toArray方法。

List<Integer> list = new ArrayList<>();
int[] a = list.stream().mapToInt(Integer::intValue).toArray();

 注:toArray方法,有无参和有参,无参的话返回Object[ ],有参的话,需要我们指定类型和大小,如 

Integer[] array = list.toArray(new Integer[10]);

方法2:

对于ArrayList,我们可以通过for循环+索引

        List<Integer> list = new ArrayList<>();int [] res = new int[10];for(int i = 0 ; i < res.length ; i ++){res[i] = list.get(i);}

数组 -> list集合

我们通常是通过Arrays.asList ( )

方法1:

通过Arrays.asList(list集合)

区别:List集合里面不能存放基本类型,所以只能将int[ ]数组当做一个整体,放进list中

        int[] res = new int[10];List<int[]> list = Arrays.asList(res);  //存放的是int[]Integer[] res1 = new Integer[10];List<Integer> list1 = Arrays.asList(res1);//存放的是Integer

 方法2:

Collections工具包下的 addAll方法(集合引用,数组元素(可以是几个值,也可以是一个数组引用))

        Integer[] res1 = new Integer[10];List<Integer> list1 = Arrays.asList(res1);Collections.addAll(list1,res1);

方法3:

通过stream流

将array数组转换成流,然后收集到list中

String[] array = {"Element1", "Element2"};
List<String> list = Arrays.stream(array).collect(Collectors.toList());

二、list集合数组的使用场景

首先,如果你需要用到索引,那么直接抛弃LinkedList,在ArrayList和数组中抉择吧。

LinkedList一般用于队列 / 栈,有个前后顺序。【后面会有专门文章讲解】

ArrayList和List中抉择:

如果需要动态扩容(不知道具体大小),使用ArrayList吧,其他场景我认为都可以使用数组,因为无论从空间还是查询效率上,数组会更胜一筹。

注意:

对于ArrayList数据结构,我们也是可以做到,对同一个索引,进行重复覆盖的。
【我第一次接触,以为ArrayList和LinkedList一样,调用add方法,只能一直往后加,后面知道ArrayList有一个add方法,参数是索引 、 value值,方法返回值为void】。

而一个参的add方法(value),方法返回值为boolean。

这个方法对于ArrayList实现,没用,返回值一直是true,
而对于Set数据结构,就有用了,因为set有去重的功能,当有元素重复,则返回false;

        ArrayList<Integer> list = new ArrayList<>();list.add(0,1);list.add(0,2);System.out.println(list.get(0)); // 输出2,说明可以对同一索引进行覆盖处理...

 LinkedList实现中的add(索引,value)方法

        LinkedList<Integer> linkedList = new LinkedList();linkedList.add(0,1);linkedList.add(0,2);System.out.println(linkedList); // 输出[2,1]

三、碰到需要去重的,我们可以考虑用HashSet数据结构。

例1:给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和:

  • 子数组的长度是 k,且
  • 子数组中的所有元素 各不相同 。

返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件,返回 0 。

子数组 是数组中一段连续非空的元素序列。

 通过HashSet,保证窗口中的元素不重复,我们不用去加个循环套if逐个判断,窗口是否有重复元素,空间换时间

 public long maximumSubarraySum(int[] nums, int k) {long ans = 0l,sum = 0l; // 数组元素都大于 0 ,不用赋Long.MIN_VALUEHashSet<Integer> window = new HashSet();int left = 0;for(int right = 0; right < nums.length; right++){while(window.contains(nums[right]) || right - left >= k){ //不满足窗口的条件sum -= nums[left];window.remove(nums[left++]);}sum += nums[right];window.add(nums[right]);if(right - left + 1== k) ans = Math.max(ans,sum);}return ans;}

四、判断字符串中是否存在某一特性

判断当前字符串是否存在以元音字母开头或结尾

方法1:通过Hash先去一一存放元音字母,然后通过contains函数

字符串结尾字符,通过word.length( ) -1去获取

private HashSet<Character> vowelSet = new HashSet<>();private void init(){vowelSet.add('a');vowelSet.add('e');vowelSet.add('i');vowelSet.add('o');vowelSet.add('u');}private boolean check(String word){// 判断是否以元音开头或结尾return vowelSet.contains(word.charAt(0)) &&                     vowelSet.contains(word.charAt(word.length()-1));}

五、数组相关

创建一个二维数组

        int[][] cnt = new int[][]{{1,2,3},{4,5,6},{7,8,9}};int[][] cnt1 = new int[3][3];cnt1[0][0] = 1;cnt1[0][1] = 2;//以下是错误写法int[][] cnt = new int[3][3]{{1,2,3},{4,5,6},{7,8,9}};

 六、排序

TreeSet中覆盖Comparator接口,重写compare方法 ,o1 - o2 表示升序,o2 - o1 表示降序

 对于List<List<Node>>结构,有个场景:

将多个List<Node>中的Node元素,根据value属性进行排序,并放在一个数组当中

 先全部放进来,然后直接调用sort方法【sort方法也能直接对二维数组进行排序,默认是一维的】

        int n = nums.size();int sumLen = 0;for(List<Integer> list : nums){sumLen += list.size();}int[][] temp = new int[sumLen][2];//将多个列表 合并成一个结构int k = 0;for(int i = 0 ; i < n ; i ++){for(int x : nums.get(i)){temp[k][0] = x; // 存具体的值temp[k++][1] = i; // 存索引}}Arrays.sort(temp,(a,b) -> a[0] - b[0]);

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop生态圈框架部署 伪集群版(七)- Hive部署

文章目录 前言一、Hive部署&#xff08;手动部署&#xff09;1. 下载Hive2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决冲突2.3.1 解决guava冲突2.3.2 解决SLF4J冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包 4. 初始化MySQL上的存…

C++析构函数和构造函数

一、构造函数 1.构造函数的基本概念 1.对构造函数的理解&#xff1a; 构造函数是类的一种特殊成员函数&#xff0c;其主要功能是在创建对象时进行初始化操作。它的名字与类名相同&#xff0c;并且没有返回值类型&#xff08;不能是void&#xff09;。例如&#xff0c;对于一个…

Cherno C++学习笔记 P32 字符串

这篇文章我们来讲字符串。字符串可以说是最重要的变量类型了&#xff0c;因为对字符串的读写极大地影响到我们的程序和用户之间的交互。甚至很多很庞大的程序就只是在处理字符串。 对于字符串&#xff0c;我们同时需要有关于数组和指针的关系&#xff0c;字符串的实现与数组是…

linuxCNC(五)HAL驱动的指令介绍

HAL驱动的构成 指令举例详解 从终端进入到HAL命令行&#xff0c;执行halrun&#xff0c;即可进入halcmd命令行 # halrun指令描述oadrt加载comoonent&#xff0c;loadrt threads name1 period1创建新线程loadusr halmeter加载万用表UI界面loadusr halscope加载示波器UI界面sho…

在做题中学习(78):数组中第K个最大元素

解法&#xff1a;快速选择算法 说明&#xff1a;堆排序也是经典解决topK问题的算法&#xff0c;但时间复杂度为&#xff1a;O(NlogN) 而将要介绍的快速选择算法的时间复杂度为: O(N) 先看我的前两篇文章&#xff0c;分别学习&#xff1a;数组分三块&#xff0c;随机选择基准…

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了&#xff0c;也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科&#xff1a; 事务&#xff08;Transaction&#xff09;&#xff0c;一般是…

MySQL 服务无法启动

常见原因: 检查端口占用&#xff1a; 使用命令行工具&#xff08;如netstat&#xff09;来检查3306端口是否已被其他程序占用,输入netstat -ano&#xff08;Windows&#xff09;或netstat -tulnp | grep 3306&#xff08;Linux/Mac&#xff09;来查找3306端口的占用情况。如果…

基于Node.js的后端服务基础模块及应用

使用generator-express-no-stress-typescript脚手架工具创建一个图片上传服务的模板工程&#xff0c;执行如下指令&#xff1a; npm config set registry https://registry.npmmirror.com yo express-no-stress-typescript uploadService 可以看到后端框架如下&#xff1a; 先…

Hadoop生态圈框架部署 伪集群版(八)- Sqoop安装与配置

文章目录 前言一、Sqoop安装与配置&#xff08;手动安装配置&#xff09;1. 下载Sqoop2. 解压Sqoop安装包2.1 解压2.2 重命名 3. 配置Sqoop3.1 配置Sqoop环境变量3.2 修改 sqoop-env.sh 配置文件3.3 配置jar包3.3.1 配置MySQL驱动jar包3.3.2 配置commons-lang-2.6.jar包 4. 测试…

视频编辑技术:一键生成混剪视频的AI技术应用

随着视频内容的爆炸式增长&#xff0c;视频编辑技术也在不断进步。本文将探讨如何利用AI技术&#xff0c;实现一键生成混剪视频&#xff0c;并自动添加配音和字幕&#xff0c;以提高视频编辑的效率和质量。 AI技术在视频编辑中的应用 AI技术在视频编辑领域的应用越来越广泛&am…

笔记本外接显示屏没声音

1、笔记本正常有声音&#xff0c;但是外接显示屏后没有声音了怎么回事呢&#xff1f;原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出&#xff0c;但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法&#xff1a;打开笔记本设置&#xff0c;选择声…

Linux其二设置端口号,静态ip以及命令

目录 1、VI编辑器 【linux版本的文本文件】 2&#xff09; 补充的vi编辑器的其他内容(了解) 2、ln 连接的意思 link的缩写 3、文件的查看 【重点】 4、压缩与解压&#xff08;重点&#xff09; 5、find 查找命令 6、which & whereis 作用是一样的&#xff0c;表示某…

飞飞5.4游戏源码(客户端+服务端+工具完整源代码+5.3fix+5.4patch+数据库可编译进游戏)

飞飞5.4游戏源码&#xff08;客户端服务端工具完整源代码5.3fix5.4patch数据库可编译进游戏&#xff09; 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】飞飞5.4游戏源码&#xff08;客户端服务端工具完整源代码5.3fix5.4patch数据库可编译进游戏&#xff09; 链…

【Linux】进程间通信 -- System V 消息队列

前言 上节Linux学习&#xff0c;我们学习了System V的共享内存&#xff0c;本节我们学习System V 的另一种通信方式 — 消息队列 文章目录 前言一. 消息队列的原理二.创建消息队列二. 查看消息队列三. 删除消息队列四. 读写数据结束语 一. 消息队列的原理 消息队列的本质同共享…

Elasticsearch入门之HTTP基础操作

RESTful REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是&#xff0c;客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在…

4.模块化技术之子程序

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 ​编辑 1.模块化基础和概述 使用模块化有什么好处 两大类模块化技术 程序局部的模块化 SAP系统内全局模块化 封装有什么好处&#xff1f; 2.子程序模块化 三种传递类型 子程序结构…

69 mysql 中 is null 的实现

前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…

51c嵌入式~单片机合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12581900 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的程…

网上图书购物管理系统|Java|SSM|VUE| 前后端分离

【一】可以提供远程部署安装&#xff0c;包扩环境 【二】提供软件相关的安装包 【三】如果需要提供java入门资料可咨询 【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、M…

Python酷库之旅-第三方库Pandas(264)

目录 一、用法精讲 1251、pandas.tseries.offsets.WeekOfMonth.is_year_end方法 1251-1、语法 1251-2、参数 1251-3、功能 1251-4、返回值 1251-5、说明 1251-6、用法 1251-6-1、数据准备 1251-6-2、代码示例 1251-6-3、结果输出 1252、pandas.tseries.offsets.Las…