刷题随笔之哈希表

哈希和哈希表

哈希

哈希(Hash),也叫做散列,杂凑。可以认为是一种算法或者是思想。
其作用是对任意长度的输入通过一定的转换映射成相同的长度。
对于一个关键字Key,都会得到一个f(Key),这个f()就是哈希函数。一般来说,一个好的哈希函数会让不同的Key对应不同的值(当不同的Key得到相同值的时候称为哈希碰撞,应当尽量避免)。

哈希表

哈希表(Hash Table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。(百度百科)

哈希表例题和解析

通过以下几个例子来一起看看哈希表的一些使用。

简单:217.存在重复元素
中等:49. 字母异位词分组

存在重复元素

Q:给定一个整数数组,判断是否存在重复元素。
如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

先来看题,很容易理解题目,在一个数组中找是不是出现了重复的元素,一看到重复,其实就很容易想到使用哈希的思想,因为在哈希中键和值总是有着对应的关系。在这道题目中,键就是数组中的元素,而值,可以是其存放的地址,可以是其出现的次数这些都可以让我们找到那个重复的元素。
下面是本题的java代码

public boolean containsDuplicate(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        for (int x : nums) {
            if (!set.add(x)) {
                return true;
            }
        }
        return false;
    }

这道题是一个非常简单的题目,但是我们可以从里面总结出一点就是哈希表是可以用来解决重复这个问题的。

字母异位词分组

Q:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]

在这道题目中,我们可以找到问题的关键:分组。对于一串输入,我们要对他们进行分组,那么分组的依据是什么,就是组成该字符串的字母都是什么,在这个问题中,我们的键就是组成这个字符串的字母,值就是在输入中和键的组成相同的字符串组成的列表。
来看代码:

public List<List<String>> groupAnagrams(String[] strs) {
		//对于我们的思路,首先构建一个hashmap,key部分选择string类型用来存放组成字符串的字母串,在遍历过程中找到相同组成就加入到对应value的list中
       	Map<String, List<String>> map = new HashMap<String, List<String>>();
       	
       	for (String str : strs) {
       		int[] counts = new int[26];
            int length = str.length();
            //这里遍历字符串找出所有组成的字母
            for (int i = 0; i < length; i++) {
                counts[str.charAt(i) - 'a']++;
            }
            // 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 26; i++) {
                if (counts[i] != 0) {
                    sb.append((char) ('a' + i));
                    sb.append(counts[i]);
                }
            }
            String key = sb.toString();
            //获得key对应的value
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            //将str加入list
            list.add(str);
            //更新key对应的value
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
 
    }

在这个问题中, 我们可以看到,哈希表在分组这个问题中也有着它的作用。而重复,实际上也是分组的一种,把相同的元素分到同一组中。在解决诸如此类的问题中,不妨考虑一下是使用哈希表这种数据结构。

随便写写不喜勿喷,题目来源于LeetCode网站。

文尾贴一个java HashMap 底层源码解析的文章。
阿里,腾讯,字节的面试官最爱问的HashMap,这次直接连底层原理都帮你搞懂了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值