最近在LeetCode刷题,遇见很多问题,比如一看代码就会,但是一上手问题就层出不穷,各式各样,甚至HashMap 都能拼错(大小写),所以总结一下有关HashMap的有关算法;
目录
简单了解一下HashMap:
什么时候使用HashMap ?
算法中常会用到的HashMap中的方法:
实战算法题:
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构 ;Map集合基于 键(key)/值(value)映射。每个键最多只能映射一个值。键可以是任何引用数据类型的值(因为HashMap是支持泛型的),键(key)不可重复;值可以是任何引用数据类型的值,可以重复;键值对存放无序。
Map map1 = new hashMap<>();
Map map2 = new hashMap<>();
HashMap 底层剖析可参考:哈希表原理、底层实现剖析_南斋孤鹤的博客-CSDN博客_哈希表底层
一切需要统计字符串或者数组中的元素个数的问题,大多都可以使用HashMap来解题;
1、put(K key,V value);向HashMap集合中添加元素(也称将键(key)/值(value)映射存放到HashMap集合中)
public class Test {
public static void main(String[] args) {
HashMap map = new HashMap<>();
map.put("Tom", 100);//向map中添加元素key - value
map.put("Tom", 90);//由于map中的键是不能重复的,所以第二次添加也就变成了修改;
}
//此时HashMap中就只有一个数据:"Tom", 90
}
注意:由于HashMap的键值不能重复,因此在使用put方法在向集合中添加元素时,一般不能添加键相同的元素,否则新添加的元素的value值会覆盖原来的value值。
2、get(Object key) 返回指定键所映射的值,没有该key对应的值则返回 null;
public class Test {
public static void main(String[] args) {
HashMap map = new HashMap<>();
map.put("Tom", 100);
System.out.println(map.get("Tom"));//输出100
}
}
3、getOrDefault(key,默认值);我么知道在Map中会存储一一对应的key和value。那么这个方法就是如果在Map中存在getOrDefault方法中的key,则返回key所对应的的value。如果 在Map中不存在key,则返回默认值。
public static void main(String[] args) {
HashMap map = new HashMap<>();
map.put("Tom", 100);
map.put("liming",90);
map.put("Jeck",80);
System.out.println(map.getOrDefault("Demo",0));//输出:0
System.out.println(map.getOrDefault("Tom",0));//输出:100
}
4、contiansKey(key);判断指定的key是否存在,如果存在返回true;否则返回false;
public static void main(String[] args) {
HashMap map = new HashMap<>();
map.put("Tom", 100);
map.put("liming",90);
map.put("Jeck",80);
System.out.println(map.containsKey("Tom"));//输出:true
System.out.println(map.containsKey("To"));//输出:false
}
}
5、remove(Object key) 删除HashMap集合中键为key的数据并返回其所对应value值
public static void main(String[] args) {
HashMap map = new HashMap<>();
map.put("Tom", 100);
map.put("liming",90);
map.put("Jeck",80);
Integer res = map.remove("Jeck");
System.out.println(res);//输出:80
}
}
题目一:给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
解决方法:记录字符串中每个字符的个数,然后按字符串的字符顺序逐个查找;
class Solution {
public int firstUniqChar(String s) {
Map map = new HashMap<>();
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < s.length(); ++i) {
if (map.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
}
题目二:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
解决方法:如果字符串s和t的字符出现次数一样,那么我们先将字符s中的每一个字符存到hashmap中,然后在按照字符串t中的字符顺序逐一将hashmap取空,最后判断如果hashmap为空,则二者相同;
public boolean isAnagram2(String s, String t) {
Map map = new HashMap<>();
for (char ch : s.toCharArray()) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
for (char ch : t.toCharArray()) {
Integer count = map.get(ch);
if (count == null) {
return false;
} else if (count > 1) {
map.put(ch, count - 1);
} else {
map.remove(ch);
}
}
return map.isEmpty();
}