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

一、字母异位词分组

问题描述:

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

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

示例 1:

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

示例 2:

复制代码
输入: strs = [""]
输出: [[""]]

示例 3:

复制代码
输入: strs = ["a"]
输出: [["a"]]
java 复制代码
//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 变为一个字符串,**该字符串列出了数组中的所有元素,并用逗号分隔,每个元素都会被加上方括号\[\]
java 复制代码
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
java 复制代码
//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中没有下标)

相关推荐
微尘hjx4 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
云和数据.ChenGuang4 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠4 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
silvamux_6 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
步行cgn7 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠7 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
小蒜学长7 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
Deng桑7 小时前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai
小蒋观天下8 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习