当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法
代码随想录哈希表理论基础代码随想录 (programmercarl.com)
这道题用数组模拟了一个哈希表
class Solution {
public boolean isAnagram(String s, String t) {
int[] record=new int[26];
for(char c:s.toCharArray())
{
record[c-'a']++;
}
for(char c:t.toCharArray())
{
record[c-'a']--;
}
for(int i:record)
{
if(i!=0)
return false;
}
return true;
}
}
使用数组来做哈希的题目,是因为题目都限制了数值的大小。
而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
nums1 数组为 null; nums1 数组长度为 0;有什么区别?d
nums1
数组为 null 意味着 nums1
这个数组没有被分配内存空间,它没有引用任何对象,因此不能进行任何操作,包括获取数组的长度或访问数组中的元素。如果 nums1
为 null,那么直接返回一个长度为 0 的新数组。
而 nums1
数组长度为 0 表示 nums1
数组已经被分配了内存空间,但其中没有任何元素。它是一个空数组,可以执行一些针对空数组的操作(例如遍历、修改等),但是由于没有任何元素,所以返回的结果仍然是一个空数组。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//主要是学习Java中HashSet的用法
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
return new int[0];
}
Set<Integer> set1=new HashSet<>();
Set<Integer> set2=new HashSet<>();
for(int i:nums1)
{
set1.add(i);
}
for(int j:nums2)
{
if(set1.contains(j))
{
set2.add(j);
}
}
return set2.stream().mapToInt(x->x).toArray();
}
}
Set<Integer>
是一个Java泛型接口,表示一个整数的集合,其中每个元素都是一个 Integer
对象。
而Set<int>
是不存在的,因为Java中的基本类型(例如 int、double、boolean 等)都不是对象,无法作为泛型实例化的类型参数。如果尝试使用 Set<int>
,会在编译时出现错误。
修修补补的写出来了,重点是读出题里面的”循环“
class Solution {
public boolean isHappy(int n) {
int i=0;
Set<Integer> set1=new HashSet();
int sum=0;
while(n!=1)
{
int j=n;//这里别忘了更新j
while(j!=0)
{
i=j%10;//i用于取出位数
sum+=i*i;
j=j/10;//j用于去除位数 从头到尾不断重复利用
System.out.println("i="+i);
}
n=sum;//用sum更新n
if(set1.contains(n))
{
return false;
} else{
set1.add(n);
System.out.println("n="+n);
}
sum=0;//sum用完了 更新sum
}
return true;
}
}
们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。
接下来是map中key和value分别表示什么。
这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。
那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。
所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。
class Solution {
public int[] twoSum(int[] nums, int target) {
// 因为是两个数,遍历数组,判断target与nums[i]之差是否出现会非常方便
//照旧上来先判空
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++)
{
int temp=target-nums[i];
if(map.containsKey(temp))
{
res[1]=i;//下标1
res[0]=map.get(temp);//下标2
break;
}
map.put(nums[i],i);//值是key 下表是value;
}
return res;
}
}