Leecode刷题day06|242.有效的字母异位词、349. 两个数组的交集、 202. 快乐数、1. 两数之和

一、有效的字母异位词

  1. 要快速地寻找字母是否出现过,所以会用到哈希表。
  2. 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之间,可以使用通过数组的方式创建哈希表。但如果对于数组中的元素没有大小限制的话,就应该使用集合来构造一个哈希表。基于以下两点:

  1. 需要查找两个数组中共同拥有的元素,所以可以用到哈希表查询。
  2. 数组中元素的大小没有限制,此时,如果使用数组的方式构造哈希表,会造成内存的极大浪费。

主要的过程为:

  1. 首先定义一个HashSet对象(无序、不重复、底层为哈希表),将第一个数组中的元素添加到对象中,无须进行重复元素的删除,因为对象内部就是没有重复的元素。
  2. 对于已经构造好的哈希表,通过第二个数组的每个元素在哈希表中进行查找,看元素是否存在,若存在添加到另一个HashSet对象中作为最终的返回结果。
  3. 将另一个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;
    }

总结

今天的主要收获:

  1. 了解了哈希表的相关知识,知道可以通过数组、set、map等结构来构造一个哈希表,以及在何种环境下使用不同的方式
  2. 知道了如何在Java中使用set、map。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值