代码随想录算法训练营第六天 | 哈希表 四道简单题

简介: 代码随想录算法训练营第六天 | 哈希表 四道简单题

前言

哈希表(英文名 Hash table, 国内也被称为散列表)

哈希表是根据关键码的值而直接进行访问的数据结构, 数组就是一张哈希表

哈希表一般用来快速判断一个元素是否出现在集合里

例如要查询一个名字是否在这所学校里。

要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。

我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。

将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数

上述例子来源于代码随想录

今日任务:

咱就是说, 万万没想到我现在做曾经做过的简单题竟然这么的游刃有余,哈哈哈哈哈

242. 有效的字母异位词

题目描述

网络异常,图片无法展示
|

解题思路

整体解题思路就是记录字符串 s中每一个字母计算出现的次数, 再去遍历字符串 t中的每一个字母去做比较是否一致

字符串转 char数组 循环遍历 char数组使得对应下标 ++ 在 --, 如果当前下标出现 -的就代表元素个数不一致

最后一步的判断可以留到最后遍历我们的统计数组来做, 也会更快一点, 不用每一次对数组进行操作的时候都去判断

代码展示

public static boolean isAnagram(String s, String t) {
    if (s.length() != t.length()){
        return false;
    }
    int[] intsS = new int[26];
    char[] charsS = s.toCharArray();
    for (int i = 0; i < charsS.length; i++) {
        intsS[charsS[i] - 'a'] =  intsS[charsS[i] - 'a'] + 1;
    }
    char[] charsT = t.toCharArray();
    for (int i = 0; i < charsT.length; i++) {
        intsS[charsT[i] - 'a'] =  intsS[charsT[i] - 'a'] - 1;
        if (intsS[charsT[i] - 'a'] < 0){
            return false;
        }
    }
    return true;
}
复制代码

提交结果

网络异常,图片无法展示
|

总结

多学多练算法不一定会让你的编码水平变得多么高深,甚至在你工作中可能完全用不到,但是如果碰到了就是赚了

只能说游刃有余,虽然最后一步是在每次修改统计数组的时候去做的判断,增加了时间消耗,但是实际上在编码过程中考虑到了这个问题,只是懒得改了,大家不要有这个坏习惯

349. 两个数组的交集

题目描述

网络异常,图片无法展示
|

解题思路

和上一道题一样的,先去记录每一个元素是否出现过,如果出现过就加入到返回里面

需要注意的是要用 Set集合,因为元素是可能重复的

代码展示

public static int[] intersection(int[] nums1, int[] nums2) {
    Set<Integer> result = new HashSet<>();
    Map<Integer,Integer> map = new HashMap<>();
    for (int i = 0; i < nums1.length; i++) {
        map.put(nums1[i], map.getOrDefault(nums1[i], 0) + 1);
    }
    for (int i = 0; i < nums2.length; i++) {
        if (map.get(nums2[i]) != null) {
            result.add(nums2[i]);
        }
    }
    return result.stream().mapToInt(Integer::intValue).toArray();
}
复制代码

提交结果

网络异常,图片无法展示
|

202. 快乐数

题目描述

网络异常,图片无法展示
|

解题思路

这道题就是一直去按照题目中的要求计算, 然后用 Set去存储每一次计算出来的返回值,如果返回值已存在则证明陷入了死循环

代码展示

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while(n != 1){
            set.add(n);
            n = test(n);
            if (set.contains(n)) {
                return false;
            }
        }
        return true;
    }
    public int test(int n){
        int result = 0;
        while(n >= 10){
            int m = n % 10;
            n /= 10;
            result += m * m;
        }
        return result += n * n;
    }
}
复制代码

提交结果

网络异常,图片无法展示
|

总结

这道题第一次提交的时候,在 test方法里面循环判断  >= 10 写成了 >10 边界没判断清楚, 失误失误

1. 两数之和

题目描述

网络异常,图片无法展示
|

解题思路

创建 map存储元素值和下标

遍历数组,判断 map中是否存在 (target - 当前元素),若存在,则直接返回两个下标, 若遍历结束都不存在则直接返回 null

代码展示

public static  int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        if (map.containsKey(target - nums[i])) {
            return new int[]{i,map.get(target - nums[i])};
        }else{
            map.put(nums[i], i);
        }
    }
    return null;
}
复制代码

提交结果

网络异常,图片无法展示
|

总结

万万没想到以前这道题还给我带来了这么大的困扰,竟然错过这么多次, 手动捂脸,哈哈哈,重新做起来真的是游刃有余




目录
相关文章
|
4天前
|
存储 监控 JavaScript
深度探秘:运用 Node.js 哈希表算法剖析员工工作时间玩游戏现象
在现代企业运营中,确保员工工作时间高效专注至关重要。为应对员工工作时间玩游戏的问题,本文聚焦Node.js环境下的哈希表算法,展示其如何通过快速查找和高效记录员工游戏行为,帮助企业精准监测与分析,遏制此类现象。哈希表以IP地址等为键,存储游戏网址、时长等信息,结合冲突处理与动态更新机制,确保数据完整性和时效性,助力企业管理层优化工作效率。
16 3
|
4天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
10天前
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
1月前
|
算法 安全
散列值使用相同的哈希算法
当使用相同的哈希算法对相同的数据进行散列时,所产生的散列值(也称为哈希值或摘要)总是相同的。这是因为哈希算法是一种确定性的函数,它对于给定的输入将始终产生相同的输出。 例如,如果你用SHA-256算法对字符串"hello world"进行哈希处理,无论何时何地,只要输入是完全一样的字符串,你都会得到相同的160位(40个十六进制字符)的SHA-256散列值。 但是,需要注意的是,即使是输入数据的微小变化也会导致产生的散列值完全不同。此外,不同的哈希算法(如MD5、SHA-1、SHA-256等)会对相同的数据产生不同的散列值。 哈希算法的一个关键特性是它们的“雪崩效应”,即输入中的一点小小
34 4
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
12天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
49 0
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
67 1
|
2月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。

热门文章

最新文章