首页 > 编程语言 >【Java完整版 面试必备】Leetcode Top100题目和答案-哈希

【Java完整版 面试必备】Leetcode Top100题目和答案-哈希

时间:2024-07-01 10:29:21浏览次数:19  
标签:Java 哈希 nums int 数组 字符串 new 完整版

以下摘自leetcode Top100精选题目-哈希

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

Solution:

可以通过使用哈希表来解决,从而将时间复杂度降低到O(n)。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 创建一个哈希表,用来存储已遍历过的数字及其对应的索引
        Map<Integer, Integer> numMap = new HashMap<>();
        
        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            // 计算当前数字与目标值之间的差值
            int complement = target - nums[i];
            
            // 如果差值已经在哈希表中,则说明我们找到了一对解
            if (numMap.containsKey(complement)) {
                // 返回这对解的索引
                return new int[]{numMap.get(complement), i};
            }
            
            // 将当前数字及索引存入哈希表,以便后续查找
            numMap.put(nums[i], i);
        }
        
        // 如果没有找到符合条件的数对,则返回空数组(本题假设一定有解,所以这里理论上不会执行)
        return new int[0];
    }
}

创建了一个哈希表numMap,用于存储已经遍历过的每个数字及其对应的索引。然后遍历整个数组nums,对于每个遍历到的数字nums[i],计算它与目标值target之间的差值complement,并检查这个差值是否已经在哈希表中。如果差值存在,就说明找到了两个数,它们的和为目标值,直接返回这两个数的索引。如果差值不在哈希表中,则将当前数字及其索引存入哈希表,继续遍历。这样,只需要遍历一次数组即可找到答案。

49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例:

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

Solution:

public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0) {
            return new ArrayList<>();
        }
        
        // 使用HashMap存储字母异位词分组,键为排序后的字符串,值为该字母异位词组的列表
        Map<String, List<String>> anagramGroups = new HashMap<>();

        for (String str : strs) {
            // 对当前字符串排序,得到排序后的字符串作为哈希表的键
            char[] charArray = str.toCharArray();
            Arrays.sort(charArray);
            String sortedStr = new String(charArray);

            // 如果排序后的字符串已经在哈希表中,则将当前字符串添加到对应的列表中
            if (!anagramGroups.containsKey(sortedStr)) {
                anagramGroups.put(sortedStr, new ArrayList<>());
            }
            anagramGroups.get(sortedStr).add(str);
        }

        // 将哈希表的值(即所有字母异位词分组)收集到一个List中并返回
        return new ArrayList<>(anagramGroups.values());
    }
}

     先检查输入是否为空,遍历给定的字符串数组。对于每一个字符串,将其字符排序后得到一个新的字符串,用作哈希表的键。如果这个键不存在于哈希表中,则创建一个新的列表作为值;如果键已存在,则将当前字符串添加到对应的列表中。将哈希表中的所有值(即所有字母异位词的分组)收集到一个新的列表中并返回。这种方法的时间复杂度主要取决于排序操作,对于每个字符串来说是O(nlogn),其中n是字符串的最大长度,总的时间复杂度接近O(m*nlogn),m为字符串数组的长度。

128. 最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例:

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

Solution:

import java.util.HashSet;
import java.util.Set;

public class Solution {
    public int longestConsecutive(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }

        Set<Integer> numSet = new HashSet<>();
        for (int num : nums) {
            numSet.add(num);
        }

        int maxLength = 0;

        for (int num : numSet) {
            // 只有当num-1不存在时,才认为num是新序列的起点
            if (!numSet.contains(num - 1)) {
                int currentNum = num;
                int currentLength = 1;

                // 向序列右侧扩展
                while (numSet.contains(currentNum + 1)) {
                    currentNum++;
                    currentLength++;
                }

                // 更新最长序列长度
                maxLength = Math.max(maxLength, currentLength);
            }
        }

        return maxLength;
    }
}

将所有数组元素放入一个HashSet中,便于快速检查元素是否存在。遍历HashSet中的每个元素,对于每个元素,如果减一元素不存在于集合中,说明可以作为连续序列的起始点。通过不断检查并累加当前元素加一的值是否存在于集合中,来确定当前序列的长度。

标签:Java,哈希,nums,int,数组,字符串,new,完整版
From: https://blog.csdn.net/weixin_43298211/article/details/140092440

相关文章

  • (免费领源码)java#Springboot#mysql物品代拿系统32500-计算机毕业设计项目选题推荐
    摘 要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术开发,Sp......
  • Java 说一下你熟悉的设计模式?
    在Java开发中,设计模式是常用的解决方案,用于解决软件设计中的常见问题。以下是一些常用的设计模式:创建型模式(CreationalPatterns)单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。示例:publicclassSingleton{privatestaticSingletoni......
  • 千万别忽视基础!十张图带你一步步理解Java内存结构!
    作为一个Java程序员,在日常的开发中,不必像C/C++程序员那样,为每一个内存的分配而操心,JVM会替我们进行自动的内存分配和回收,方便我们开发。但是一旦发生内存泄漏或者内存溢出,如果对Java内存结构不清楚,那将会是一件非常麻烦的事情!本文笔者将为大家详解Java内存结构。面试tips聊聊......
  • 基于JAVA的学生信息管理系统设计(答辩稿)
    基于JAVA的学生信息管理系统设计目录一、选题背景及意义1二、国内外研究现状22.1国内研究现状22.2国外研究现状2三、研究主要内容2四、功能设计34.1学生用户功能34.2教师用户功能34.3管理员用户功能34.4数据库设计4五、系统实现5六、总结8参考文......
  • 基于JAVA的学生信息管理系统设计
    目录摘要IIIABSTRACTIV1绪论11.1选题背景及意义11.1.1选题背景11.1.2选题意义11.2国内外研究现状及发展趋势21.2.1国内研究现状21.2.2国外研究现状21.2.3发展趋势21.3研究主要内容32相关技术概论52.1JavaWeb52.2Hibernate52.3MYSQL72......
  • Java助力加固Excel文件,保障数据安全
    前言Excel文件保护是常用的一种功能,文件保护主要有三种:添加密码,如果没有密码不允许打开文件。添加密码,如果没有密码,不能修改文件,但可以打开,只读以及另存文件。只读推荐,通常推荐打开Excel文件的用户使用只读模式打开,这种方式仅是一种提示,并非强行保护文件。给Excel添加保护......
  • Java-HashMap和ConcurrentHashMap的区别
    Java-HashMap和ConcurrentHashMap的区别一、关键区别1.数据结构2.线程安全3.性能4.扩容机制二、源码简析1.并发控制机制2.数据结构转换:链表转红黑树3.扩容机制触发hashMap和concurentHashMap扩容机制的条件三、putIfAbsent方法computeIfAbsent方法区别​在Java......
  • Java方法递归:File文件搜索
        在Java中,方法递归是一种特殊的情况,其中方法直接或间接地调用自身。为了使用方法递归,方法需要有基本情况,即不再调用自身的条件,以防止进入无限循环。    我们来做一个搜索文件并打开的案例。以打开QQ为例,因为我的电脑只有C盘,我搜索文件的地方,就写C盘。publ......
  • Java集成框架
    Java集成框架(JavaIntegrationFramework)涵盖了许多库和工具,帮助开发者实现各种功能。这些框架包括Spring、ApacheCamel、JavaEE等。1.SpringFrameworkSpring是一个广泛使用的企业级应用程序框架,提供全面的基础设施支持,包括依赖注入、面向切面编程、事务管理等教程......
  • 494.力扣每日一题6/30 Java(三种解法)
    博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......