代码随想录算法训练营第6天| 哈希表理论基础;242.有效的字母异位词;349. 两个数组的交集 ;202. 快乐数 ;1. 两数之和

242.有效的字母异位词

Leetcode链接: link

方法一:HashMap

class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        
        Map<Character, Integer> table = new HashMap<Character, Integer>();
        for(int i = 0; i < s.length(); i ++){
            char c = s.charAt(i);
            if(table.containsKey(c)){
                table.put(c,table.get(c)+1);
            }else{
                table.put(c,1);
            }
        }
        System.out.println(table.toString());

        for(int i = 0; i < t.length(); i ++){
            char c = t.charAt(i);
            if(table.containsKey(c)){
                int temp = table.get(c);
                if(temp == 0){
                    return false;
                }else{
                    table.put(c,temp-1);
                }
            }else{
                return false;
            }
        }
        System.out.println(table.toString());
        return true;
    }
}

这是我想出来的第一种方法,用计算频率的方法计算String中每个Char出现的频率。因为我自己平时使用map的比较多,所以第一时间想到的就是这个方法。有个要注意的地方是我本来是这么写的:把String1加入到map里面,然后再把String2从map里删除,然后最后再使用isEmpty查看map是不是空的。后面改成了在前面查看String1和String2的长度是不是一样的。这样就可以省略isEmpty这一步了。

下面这个方法,是我看了答案思路写出的来的,答案基本上都是用的这个方法,使用array代替map,这个方法快了很多。

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

349. 两个数组的交集

Leetcode链接: link

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>(); //set for nums1
        Set<Integer> set2 = new HashSet<>(); //set for Intersection
        for (int i : nums1) {
            set1.add(i);
        }
        for (int i : nums2) {
            if(set1.contains(i)){
                set2.add(i);
            }
        }
        int arr[] = new int[set2.size()]; 
        int i = 0; 
        for (int x : set2){
            arr[i++] = x; 
        }
        return arr;
    }
}

这题用set不能有重复值的特性来做,把nums1放入set中,在把num1和num2重复的值放入set2,这个set2就是两个数组的交集。我们只需要把这个set变成array返回就可以了。

202. 快乐数

Leetcode链接: link

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<Integer>();
        int num = n;
        while(!set.contains(num)){
            set.add(num);
            int sum = 0;
            while(num != 0){
                int temp = num % 10;
                sum += (temp *temp);
                num /= 10;
            }

            if(sum == 1){
                return true;
            }
            num = sum;
        }
        return false;
    }
}

这题看似是一道无线循环的题目,但是我们可以找到让他停下来的方法。
比如这个示例 1中:

在这里插入图片描述

我们只需要寻找如果82,68,100这些数字如果重复出现了的话。就说明进入循环了,这时候我们就可以结束了。所以我们需要用一个set来存放所有的sum。

1. 两数之和

Leetcode链接: link

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        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;
            }else{
                map.put(nums[i],i);
            }
        }
        return result;
    }
}

这一题我之前肯定做过,但是让我这一次做我觉得我一开始会想不起来要用hashmap来做,想到用hashmap来做的人简直是天才。我一开始看到了建议我使用hashmap,我还在想如何使用hashmap,一开始是觉得把array全部塞入hashmap里面,然后再遍历一遍array找?但是直觉告诉我这不对,我也在思考如果都加入hashmap,那比如[3,3]这样如何加入hashmap?
后来也是去研究了一下答案,没想到是答案是这样的:遍历数组,检查当前位置的element在map里面有没有加起来等于target的,如果没有则把当前的element加入到map里。

总结

今天也是复习了一遍hashtable,个人还是很喜欢用hashtable的,hashtable的唯一性和O(1)的查找速度能让他在很多场景适用,而且理解起来也很简单,即使你不知道hashtable的内部原理是什么,但是你只要知道Hashmap的API也可以使用。偏简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值