代码随想录算法训练营第五天|哈希表part01

今日任务 

  •  哈希表理论基础 
  •  242.有效的字母异位词 
  •  349. 两个数组的交集 
  •  202. 快乐数
  •  1. 两数之和   

 哈希表理论基础 

建议:大家要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。  

什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。  这句话很重要,大家在做哈希表题目都要思考这句话。 

文章讲解:

代码随想录 (programmercarl.com)

 242.有效的字母异位词 

建议: 这道题目,大家可以感受到 数组 用来做哈希表 给我们带来的遍历之处。 

题目链接/文章讲解/视频讲解: 代码随想录

暴力解法

class Solution {
    public boolean isAnagram(String s, String t) {
            if(s.length()!=t.length()){
                return false;
            }
            char [] sArray=s.toCharArray();
            char [] tArray=t.toCharArray();

            Arrays.sort(sArray);
            Arrays.sort(tArray);

            for(int i = 0;i < sArray.length;i++){
                if(sArray[i]!=tArray[i]){
                    return false;
                }
            }
            return true;
    }
}

哈希表解法:

class Solution {
    public boolean isAnagram(String s, String t) {
         int hash[]= new int [26];
         for(int i = 0;i<s.length();i++){
             hash[ s.charAt(i) - 'a' ]++;
         }
         for(int i = 0;i<t.length();i++){
              hash[ t.charAt(i) - 'a' ]--;
         }
         for(int count: hash){
             if(count!=0){
                 return false;
             }
        
         }
         return true;
    }

}

 349. 两个数组的交集 

建议:本题就开始考虑 什么时候用set 什么时候用数组,本题其实是使用set的好题,但是后来力扣改了题目描述和 测试用例,添加了 0 <= nums1[i], nums2[i] <= 1000 条件,所以使用数组也可以了,不过建议大家忽略这个条件。 尝试去使用set。 

题目链接/文章讲解/视频讲解:代码随想录

使用HashSet:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1.length==0||nums1==null||nums2.length==0||nums2==null){
            return new int[0];
        }
        Set<Integer> set1= new  HashSet<>();
        Set<Integer> ReSet= new  HashSet<>();

        for(int i: nums1){
            set1.add(i);
        }
        for(int i :nums2){
            if(set1.contains(i)){
                ReSet.add(i);
            }
        }

        int[] arr=new int[ReSet.size()];
        int j=0;
        for(int i :ReSet){
            arr[j++]=i;
        }
        return arr;


    }
}

使用哈希数组:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int[] hash1 = new int[1002];
        int[] hash2 = new int[1002];
        for(int i : nums1)
            hash1[i]++;
        for(int i : nums2)
            hash2[i]++;
        List<Integer> resList = new ArrayList<>();
        for(int i = 0; i < 1002; i++)
            if(hash1[i] > 0 && hash2[i] > 0)
                resList.add(i);
        int index = 0;
        int res[] = new int[resList.size()];
        for(int i : resList)
            res[index++] = i;
        return res;
    }
}

总结:

语法:

  • for-each
  • size()和length和lengeh()用法和区别:

size

  • size 主要用于集合类,如 ListSetMap
  • size 是一个方法,用于返回集合中元素的数量。
  • 例如,如果你有一个 ListSet,你可以使用 size() 方法来获取它包含的元素数量。
  • length

  • length 主要用于数组。
  • length 是一个属性,用于返回数组的长度,即数组中的元素数量。
  • length() 是一个方法,通常用于字符串对象(String 类)以获取字符串的长度,即包含多少个字符
  • int和Integer的区别:

1、数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型;
2、默认值不同:int 的默认值是 0,而 Integer 的默认值是 null;
3、内存中存储的方式不同:int 在内存中直接存储的是数据值,而 Integer 实际存储的是对象引用,当 new 一个 Integer 时实际上是生成一个指针指向此对象;
4、实例化方式不同:Integer 必须实例化才可以使用,而 int 不需要;
5、变量的比较方式不同:int 可以使用 == 来对比两个变量是否相等,而 Integer 一定要使用 equals 来比较两个变量是否相等。
Java基础 - Integer和int的区别_int和integer的区别-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值