一、有效的字母异位词
- 要快速地寻找字母是否出现过,所以会用到哈希表。
- 26个字母,数量少,且ASCII码中连续,所以可以映射到从0到25的数组中。
基于上边两点,可以通过数组实现哈希表。
以下是代码部分:
public boolean isAnagram(String s, String t) {
//记录26个字母出现次数的数组
int code[] = new int[26];
//记录第一个字符串的各个字母出现次数
for (int i = 0; i < s.length(); i++) {
int index = s.charAt(i) - 'a';
code[index]++;
}
//比较第二个字符串的各个字母出现次数
for (int i = 0; i<t.length();i++ ){
int index = t.charAt(i) - 'a';
code[index]--;
}
//判断code数组中每个元素是否都为0
for (int i = 0; i < code.length; i++) {
if(code[i]!=0)
return false;
}
return true;
}
二、两个数组的交集
题目中元素的值在0-1000之间,可以使用通过数组的方式创建哈希表。但如果对于数组中的元素没有大小限制的话,就应该使用集合来构造一个哈希表。基于以下两点:
- 需要查找两个数组中共同拥有的元素,所以可以用到哈希表查询。
- 数组中元素的大小没有限制,此时,如果使用数组的方式构造哈希表,会造成内存的极大浪费。
主要的过程为:
- 首先定义一个HashSet对象(无序、不重复、底层为哈希表),将第一个数组中的元素添加到对象中,无须进行重复元素的删除,因为对象内部就是没有重复的元素。
- 对于已经构造好的哈希表,通过第二个数组的每个元素在哈希表中进行查找,看元素是否存在,若存在添加到另一个HashSet对象中作为最终的返回结果。
- 将另一个HashSet对象转换为数组形式,返回数组。.
以下是代码部分:
public int[] intersection2(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
Set<Integer> resSet = new HashSet<>();
//1.将第一个数组改造成哈希表
for (int i : nums1) {
set.add(i);
}
//2.通过第二个数组的元素查询哈希表
for (int i : nums2) {
if(set.contains(i))
resSet.add(i);
}
return resSet.stream().mapToInt(x -> x).toArray();
}
三、快乐数
这道题的核心有一个 无限循环 ,依据这个给定的条件,可以查询当前的数是否已经生成过从而判断是否已循环完一次。注意,这里又提到了查询,所以自然而然想到使用哈希表。由于循环中的数量时没有限定的,因此使用HashSet对象构造一个哈希表。
以下是代码部分:
public static void main(String[] args) {
isHappy(19);
}
public static boolean isHappy(int n) {
Set<Integer> hash = new HashSet<>();
while (n!=1 && !hash.contains(n)){
//将n放入哈希表中
hash.add(n);
//生成一个新的n
n = sum(n);
}
return n==1;
}
public static int sum( int n){
int sum = 0;
while(n>0){
sum+= (n%10) * (n%10);
n /= 10;
}
return sum;
}
四、两数之和
由于题中需要我们给出数组下标这个值,同时我们又要搜索数组元素的值,因此我们需要在哈希表中存储两个数值,这样就自然而然地想到使用map方式构造哈希表。
由于我们不需要哈希表中的key值有序,因此我们使用HashMap对象,HashMap是无序、key不重复、底层通过哈希表来实现的。
以下是代码部分:
public int[] twoSum3(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
int[] result = new int[2];
for (int i = 0; i < nums.length; i++) {
if(map.containsKey(target - nums[i])){
result[0] = map.get(target - nums[i]);
result[1] = i;
return result;
}
map.put(nums[i],i);
}
return result;
}
总结
今天的主要收获:
- 了解了哈希表的相关知识,知道可以通过数组、set、map等结构来构造一个哈希表,以及在何种环境下使用不同的方式
- 知道了如何在Java中使用set、map。