前言:哈希表系列的题目是第一次做,但是大概了解过哈希表,不是很难,写起来应该会比较轻松,但是因为没接触过,所以会先看一遍答案,熟悉解题思路后再自己去写。
242.有效的字母异位词
题目链接:https://leetcode.cn/problems/valid-anagram/description/
解题思路:建立一个包含26个字母的数组,因为26个小写字母的ASCII是连续的,所以可以直接用数组的index指代26个字母,数组中的值记录某一个字母出现的次数。
先遍历字符串s,对应的字母加1;再遍历t,对应的字母减1。如果最后数组中所有元素均为0,则true,否则两个字符串并非同一组字母异位组成。
代码如下:
class Solution {
public boolean isAnagram(String s, String t) {
int[] records=new int[26];
if(s.length()!=t.length()){
return false;
}
for(int i=0;i<s.length();i++){
records[s.charAt(i)-'a']++;
records[t.charAt(i)-'a']--;
}
for(int count:records){
if(count!=0){
return false;
}
}
return true;
}
}
注意:数组的长度是属性可以直接使用nums.length;字符串的长度是方法,需要使用s.length()。
学到的新方法:
- 获取字符串的字符使用s.charAt()方法;
- 增强型 for 循环:只读遍历数组或集合的每个元素。其中,type 是要遍历的元素的类型;element 是临时变量,代表每次迭代中当前的元素;collection 是要遍历的数组或集合。
for (type element : collection) {
// 循环体
}
349. 两个数组的交集
题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/description/
思路:该题数字大小的范围并不确定,可能会很大,所以不适合使用数组,选取set来实现。HashSet 是 Java 集合框架中的一种数据结构,它是 Set 接口的一个实现类,底层使用哈希表来存储元素,提供了常数时间复杂度的操作。HashSet 的特点是不允许存储重复的元素,并且不保证元素的插入顺序,即它们不是按照插入顺序存储的。较好的符合题目的要求。
常用方法如下:
- add(E e): 添加元素 e 到此集合中,如果该集合不包含该元素,则返回 true
- contains(Object o):如果此集合包含指定的元素,则返回 true
- remove(Object o): 移除指定的元素,如果该元素存在于集合中,则返回true。
- size(): 返回集合中的元素数量。
- isEmpty(): 如果集合不包含任何元素,则返回 true。
- clear():移除集合中的所有元素。
- addAll(Collection<? extends E> c): 将指定集合中的所有元素添加到此集合中。
- removeAll(Collection<?> c): 移除此集合中包含的所有指定集合中的元素。
- retainAll(Collection<?> c): 只保留此集合与指定集合共有的元素。
- iterator():返回一个迭代器,可以用来遍历集合中的元素。
代码如下:
import java.util.HashSet;
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set1 =new HashSet<>();
HashSet<Integer> sameSet=new HashSet<>();
for(int num1 :nums1){
set1.add(num1);
}
for(int num2:nums2){
if(set1.contains(num2)){
sameSet.add(num2);
}
}
//新建一个数组存放交集元素
int[] nums=new int[sameSet.size()];
int j=0;
for(int count: sameSet){
nums[j++]=count;
}
return nums;
}
}
202. 快乐数
题目链接:https://leetcode.cn/problems/happy-number/description/
思路:这个题对我来说有两个难点,一个是如何取到数字每个位数上的值;另一个是如何判定该数值不是快乐数。
针对第一个难点:通过除10取余来得到数字。
第二个难点:题目的一个关键是如果不是快乐数,得到的结果sum会出现无限循环,也就是说当sum出现了重复值时,意味着该数字不是快乐数。因此可以设置一个HashSet来保存sum值。
代码如下:
class Solution {
public boolean isHappy(int n) {
Set<Integer> records=new HashSet<>();
while(n!=1 && !records.contains(n)){
records.add(n);
n=sumCount(n);
}
return n==1;
}
private int sumCount(int n){
int result=0;
while(n!=0){
result+=(n%10)*(n%10);
n=n/10;
}
return result;
}
}
1. 两数之和
题目链接:https://leetcode.cn/problems/two-sum/description/
思路:改题需要同时记录值和下标,所以选用HashMap来解决。
HashMap 是 Java 集合框架中的一个核心类,它实现了 Map 接口,用于存储键值对(key-value pairs)。HashMap 使用哈希表来存储数据,提供了高效的插入、删除和查找操作。
常用方法:
- put(key, value):将指定的键值对插入到 HashMap 中。如果键已经存在,则更新该键对应的值。
- get(key):返回指定键对应的值。如果键不存在,则返回 null。
- remove(key):移除指定键及其对应的值。
- containsKey(key):检查 HashMap 是否包含指定的键。
- containsValue(value):检查 HashMap 是否包含指定的值。
- isEmpty():检查 HashMap 是否为空。
- size():返回 HashMap 中键值对的数量。
- clear():清空 HashMap。
代码如下:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map =new HashMap<>();
int[] res =new int[2];
for(int i=0;i<nums.length;i++){
int num=target-nums[i];
if(map.containsKey(num)){
res[1]=i;
res[0]=map.get(num);
}
map.put(nums[i],i);
}
return res;
}
}