哈希表主要用来解决判断元素是否出现在集合中的问题。
有效的字母异位词
题目链接:242. 有效的字母异位词
用数组模拟哈希,数组的0到25位存储字母,第一个字符串让数组对应的位置++,第二个字符串让对应的位置--,最后判断数组是否都为0,如果是,说明是字母异位词,否则说明不是。
class Solution {
public boolean isAnagram(String s, String t) {
int[] hash = new int[26];
int len1 = s.length();
int len2 = t.length();
for(int i = 0; i < len1; i++){
hash[s.charAt(i) - 'a']++;
}
for(int j = 0; j < len2; j++){
hash[t.charAt(j) - 'a']--;
}
for(int i = 0; i < hash.length; i++){
if(hash[i] != 0){
return false;
}
}
return true;
}
}
两个数组的交集
题目链接:349. 两个数组的交集
解题思路:set作为哈希结构存储元素
- 先定义一个set结构的哈希表存储数组1中的元素
- 如果哈希表中包含数组2中的元素,则将数组2的这个元素放入结果set中,方便去重
- 通过stream流将set集合转换为数组输出
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> hash = new HashSet();
Set<Integer> res = new HashSet();
for(int num1 : nums1){
hash.add(num1);
}
for(int num2 : nums2){
if(hash.contains(num2)){
res.add(num2);
}
}
return res.stream().mapToInt(x -> x).toArray();
}
}
快乐数
题目链接:202. 快乐数
两个知识点,一是无限循环需要将判断这个数是否出现过,二是计算一个数各个位置平方和的下一个数。
public boolean isHappy(int n) {
//无限循环说明这个数出现过
HashSet<Integer> record = new HashSet<>();
//如果n不等于1或者没有出现过,一直循环
while (n != 1 && !record.contains(n)){
//将这个数记录下来
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n) {
int res = 0;
while (n > 0){
//余数
int temp = n % 10;
res += temp * temp;
//除数
n = n / 10;
}
return res;
}
两数之和
题目链接:1. 两数之和
判断元素在一个集合中是否出现过,使用哈希表的数据结构。
这里使用map的哈希表结构,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
Map<Integer,Integer> map = new HashMap();
for(int i = 0; i < nums.length; i++){
if(map.containsKey(nums[i])){
res[0] = map.get(nums[i]);
res[1] = i;
break;
}
map.put(target - nums[i], i);
}
return res;
}
}