Leetcode Hot 100刷题记录 -Day2(哈希表)

news2024/9/22 15:36:09

一、字母异位词分组 

问题描述:

        给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

        简单理解:字母异位词就是字母个数和种类都相同,但字母顺序不一样组成的单词集合。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]
//hot 2:字母异位词分组
class Solution{
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, List<String>> hashMap = new HashMap<>();
        for(int i = 0; i<strs.length;i++){
            char[] chars = strs[i].toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);
            List<String> list = hashMap.getOrDefault(key,new ArrayList<>());
            list.add(strs[i]);
            hashMap.put(key, list);
        }
        return new ArrayList<>(hashMap.values());
        }
}


//带有输入输出整体代码
class SolutiongroupAnagrams{
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, List<String>> hashMap = new HashMap<>();//初始化哈希表
        for(int i = 0; i<strs.length;i++){
            char[] chars = strs[i].toCharArray();//将字符串以数组形式存储
            Arrays.sort(chars);//将字母进行排序,字母异位词的单词排完序后应该都完全相同
            String key = new String(chars);//将排完序的数组作为hashmap的key
            //hashMap.getOrDefault函数:根据hashmap的key获取value(即字母异位词),若是没有这个key,则返回一个空的list
            List<String> list = hashMap.getOrDefault(key,new ArrayList<>());//声明一个类型种类为List<String>的list,因为每个字母异位词的组成形式为List<String>
            list.add(strs[i]);//将字母异位词的对应字母加入到相应list中
            hashMap.put(key, list);//根据key存放list
        }
        return new ArrayList<>(hashMap.values());//返回不同key下的value
    }
    public static void main(String[] args){
        SolutiongroupAnagrams solutiongroupAnagrams = new SolutiongroupAnagrams();
        String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat","eata"};
        System.out.println("输入:strs = " + Arrays.toString(strs));
        List<List<String>> result = solutiongroupAnagrams.groupAnagrams(strs);
        System.out.println("输出:" + result);
    }
}

知识点总结:

  • 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 的数据类型为List<String>(由字符串组成的列表);输出: [["bat"],["nat","tan"],["ate","eat","tea"]]的数据类型为List<List<String>>(输出整体为一个List,这个List里面是由一个个小的List组成,每个小List是由字符串组成)
  • Arrays.sort(chars):按照26个英文字母进行排序
  • hashMap.getOrDefault:根据hashmap的key获取value,若是没有这个key,则返回一个空的list
  • hashMap.values():返回所有key下的value
  • Arrays.toString(strs):将数据类型为包含多个字符串的数组 String[] strs 变为一个字符串,该字符串列出了数组中的所有元素,并用逗号分隔,每个元素都会被加上方括号[]
String[] strs = {"apple", "banana", "cherry"};
System.out.println(Arrays.toString(strs));
//输出
[apple, banana, cherry]

二、最长连续序列

问题描述:

        给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
//hot3: 最长连续序列
class Solution {
    public int longestConsecutive(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for(int i = 0; i<nums.length;i++){
            set.add(nums[i]);
        }
        int longestConsecutive = 0;

        for (int num : set) {
            if(!set.contains(num-1)){
                int currentnum = num;
                int currentstreak = 1;
                while(set.contains(currentnum+1)){
                    currentstreak+=1;
                    currentnum+=1;
                }
                longestConsecutive = Math.max(longestConsecutive,currentstreak);
            }
        }
        return longestConsecutive;
    }
}


//带有输入输出的代码
import java.util.Arrays;
import java.util.HashSet;

public class hot3_longestConsecutive {
    public int longestConsecutive(int[] nums) {
        HashSet<Integer> set = new HashSet<>();//hashset为无序、不重复元素集合
        //去除输入的的重复元素
        for(int i = 0; i<nums.length;i++){
            set.add(nums[i]);
        }
        //初始化最长连续
        int longestConsecutive = 0;

        //遍历set中的元素,其中for (int num : set)中的num为set集合中具体的数值,不是下标,一直遍历所有set数值
        for (int num : set) {
            //判断当前的数值-1是否包含在set中,若没有则将其设为开头;若有,则直接跳过
            if(!set.contains(num-1)){
                int currentnum = num;
                int currentstreak = 1;
                //判断当前数值+1是否存在于set集合中,若是存在,则继续循环;若是不存在,则将longestConsecutive变为Math.max(longestConsecutive,currentstreak);
                while(set.contains(currentnum+1)){
                    currentstreak+=1;
                    currentnum+=1;
                }
                longestConsecutive = Math.max(longestConsecutive,currentstreak);
            }
        }
        return longestConsecutive;
    }
    public static void main(String[] args) {
        hot3_longestConsecutive hot3LongestConsecutive = new hot3_longestConsecutive();
        int[] nums = new int[]{100, 4, 200, 1, 3, 2, 4, 5};
        int result = hot3LongestConsecutive.longestConsecutive(nums);
        System.out.println("输入:nums = " + Arrays.toString(nums));
        System.out.println("输出:" + result);
    }
}

 

 知识点总结:

  • hashset为无序、不重复元素集合
  • for (int num : set)中的num为set集合中具体的数值,不是下标;一直遍历所有set数值

        例:(这里的num为100,不是下标0,集合set中没有下标)

 

ddc5a3e1053d40238e9e4665d8124d88.png

 

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

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

相关文章

萤石云移动端sdk常见问题

使用萤石云的SDK时常会遇到各种问题 首先&#xff0c;请先查看错误码文档&#xff0c;这能解决其中的绝大多数&#xff01;&#xff01;&#xff01; 如果没有找到&#xff0c;可以看看下方这些常见问题能否解决你碰到的情况。&#xff08;iOS可以在打印日志中搜索opensdk er…

python查看wifi密码

抱歉&#xff0c;没有办法发出来&#xff0c;如果有需要的可以私信我&#xff01;&#xff01;&#xff01;

安卓13去掉权限动态申请,默认授权,不用动态申请权限

总纲 android13 rom 开发总纲说明 1、前言 2、问题分析 3.代码处理 4.代码修改 5.编译 6.彩蛋 1、前言

SpringBoot 一文复习知识点概览

目录 1、第一个SpringBoot程序 2、运行原理初探 2.1、pom.xml 2.2、启动器 spring-boot-starter 2.3、主启动类 2.4、注解 2.5、run方法流程分析 3、SpringBoot配置 3.1、yaml配置文件 3.2、JSR303数据校验 3.2.1、常见参数 3.3、多环境配置及配置文件优先顺序 3.…

基于yolov8的麦穗计数系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的麦穗计数系统是一种利用深度学习技术&#xff0c;特别是YOLOv8目标检测模型&#xff0c;对小麦麦穗进行自动识别和计数的系统。YOLOv8作为Ultralytics公司开发的最新版本&#xff0c;具备更高的性能和灵活性&#xff0c;能够在各种硬件平台上运行&am…

干货整理|一篇文章告诉你监控电脑的软件叫什么?10款电脑屏幕监控软件任你选择!(珍藏篇)

现代社会&#xff0c;电脑屏幕监控软件已成为企业管理和家庭教育中不可或缺的工具。 这类软件不仅可以帮助管理者监督员工的工作效率&#xff0c;保障企业信息安全&#xff0c;还能让家长更好地了解孩子的上网行为。 下面是精心挑选的10款备受好评的电脑屏幕监控软件&#xf…

【python】懂车帝字体反爬逐层解密案例(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

台灯怎么选对眼睛好?护眼台灯怎么选的六大技巧一定要看!

根据2024年国家卫健委最新公布的数据&#xff0c;我国儿童青少年总体近视率为52.7%&#xff0c;这一数据表明视力健康已成为不容忽视的问题。小学生近视率为42%&#xff0c;初中生高达80.7%&#xff0c;高中生更是达到了85.7%。儿童的学习环境对学习效果和视力健康有着重要影响…

系统中没有安装 git

系统中没有安装 git 安装git一、CentOS/RHEL 系统二、Ubuntu/Debian 系统 这个错误表明系统中没有安装 git。 安装git 一、CentOS/RHEL 系统 使用以下命令安装&#xff1a; sudo yum install git二、Ubuntu/Debian 系统 使用以下命令安装&#xff1a; sudo apt install g…

Java技术栈 —— Spark入门(二)之实时WordCount

Java技术栈 —— Spark入门&#xff08;二&#xff09; 一、kafka1.1 创建topic1.2 准备input与查看output 二、spark2.1 spark下的程序文件2.2 用spark-submit提交作业 参考文章&#xff1a; 参考文章或视频链接[1] 《Kafka Spark Stream实时WordCount》 实验环境&#xff…

使用dx工具将jar和class打包成dex

最近用到将三方jar和自己的class打包成dex的需求&#xff0c;研究了下&#xff0c;遇到了上些问题&#xff0c;最终成功了&#xff0c;记录下&#xff1a; 将jar放在ss目录下&#xff0c;将class放在与包名对应的目录下 com.example.myapplication.Heav.class 打包命令&#x…

android13固定app方向 强制app方向

总纲 android13 rom 开发总纲说明 1.前言 经常遇到客户有固定或者设置应用方向,不让他们改成其他方向的需求。今天我们就来处理这种问题。 2.问题分析 在 Android 10 之前,显示旋转的处理逻辑分散在多个类和模块中,Android 10 统一了这些逻辑,集中在 DisplayRotation.ja…

【数据结构】队列(Queue)

目录 队列概念 ​方法 队列模拟实现 链表实现队列 入队列 出队列 获取队头元素 数组实现队列 入队列 出队列 返回头队列 返回尾队列 完整代码 双链表实现队列 数组实现队列&#xff08;设计循环队列&#xff09; 队列概念 队列&#xff1a;只允许在一段进行插入…

传奇开服教程之新GOM引擎登录器配置教程

现在新GOM引擎的版本比以前多了一些&#xff0c;是时候和你们分享一期新GOM引擎登录器配置教程了&#xff0c;顺便来和你们分享下新GOM引擎和老GOM引擎的区别。 新GOM引擎与老GOM的区别 1、老GOM引擎1108的pak.txt就在登录器配置文件夹下&#xff0c;新GOM引擎的pak.txt在登录…

谷歌浏览器与edge哪个好用

浏览器是我们工作和生活中的重要工具&#xff0c;其中谷歌浏览器与edge是两款备受关注的浏览器工具。那么这二者中&#xff0c;哪一款更胜一筹呢&#xff1f;本文将比较这两款浏览器的功能、性能和用户体验等&#xff0c;帮助大家做出明智的选择。 谷歌浏览器的历史与发展&…

Java面试宝典-java基础01

Java面试宝典-java基础01 1、java的跨平台性2、Java是如何实现跨平台性的&#xff1f;3、JDK 和 JRE 有什么区别&#xff1f;4、为何要配置Java环境变量&#xff1f;5、Java都有哪些特性&#xff1f;6、 和 equals 的区别是什么&#xff1f;7、Java中有哪些数学函数&#xff1f…

1894. 二分查找左侧边界

代码 #include<bits/stdc.h> using namespace std; int a[110000],n,q; int zc(int x) {int l1,rn,mid;while(l<r){mid(lr)/2;if(x<a[mid]) rmid-1;else if(x>a[mid]) lmid1;else if(xa[mid]) rmid-1;}if(a[l]x) return l;else return -1; } int main() {int i…

通过React实现萤石摄像头rtsp地址格式的视频流的web展示

首先&#xff0c;我们需要拿到rtsp格式的流地址&#xff08;rtsp://admin:[password][ip]&#xff09;&#xff0c;其中 password:设备底下的6位数验证码 ip:设备的ipv4地址 这里拿到ip的方式可以直连网线和绑定wifi两种方式 然后下载PC端的萤石工作室&#xff08;下载中心…

【区块链 + 司法存证】印记区块链电子印章 | FISCO BCOS应用案例

电子印章作为传统物理印章的数字化锚定&#xff0c;除了拥有和物理印章一样的法律效力外&#xff0c;还能够有效地为企业增效降 本提质。近年来&#xff0c;随着国家双碳目标的提出以及全球新冠疫情&#xff0c;进一步加速了企业数字化转型的步伐&#xff0c;电子印章 的价值也…

day12JS-Event事件

1. 事件的分类 事件类型包括有系统事件和自定义事件。 2. 初始化事件 1. 创建事件对象&#xff0c;Event是事件对象。 bubbles:true 表示支持冒泡。 var/let 变量名 new Event(事件类型&#xff0c;事件选项是否支持冒泡(可省略)); 2. 创建一个事件目标对象的实例化对象 。…