代码随想录Day6 (值得复习)哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

代码随想录哈希表理论基础代码随想录 (programmercarl.com)

242. 有效的字母异位词 - 力扣(LeetCode)

这道题用数组模拟了一个哈希表 

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;
    }
}

349. 两个数组的交集 - 力扣(LeetCode)

使用数组来做哈希的题目,是因为题目都限制了数值的大小。

而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。

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>,会在编译时出现错误。

202. 快乐数 - 力扣(LeetCode)

修修补补的写出来了,重点是读出题里面的”循环“

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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值