海智算法训练营第五天 | 第三章 哈希表part01 | 242有效的字母异位词 349两个数组的交集 202快乐数 383赎金信

学习目标:

1. 哈希表:数组

2. 哈希表:Set集合

3. 哈希表:Map集合

 1.哈希表:数组

题目:有效的字母异位词

在没细细了解哈希表的概念之前,这道题的算法我以为只是一个基础算法,没想到涉及了哈希表,属于哈希表中的数组,特点是ascii码连续且长度有限制。

这道题解法简单,数组先记录s字符串出现几次位置+几个,然后记录t字串出现几次位置-几个。位置上都是0就是刚好抵消。

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

2.哈希表:Set集合

Set集合的优点在于查找字符编码杂乱,并且数据跨度大的数据的内存空间不会浪费大,但是相比数组的查询速度会慢一些,特别是如果题目没有限制数据的长度的话,相对数组用Set集合会更好,但这道题限制了数据,可以用哈希表数组解法,但是上一题已经用过了,这里就不再写了,大体是差不多的。

题目:两个数组的交集

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        Set<Integer> res = new HashSet<>();

        for(int x : nums1) set.add(x);
        for(int x : nums2) {
            if(set.contains(x)) res.add(x);
        }
        int[] arr = new int[res.size()];
        int index = 0;
        for(int x :res){
            arr[index++] = x;
        }
        return arr;
    }
}

3.快乐数

这题没什么好说的和上题一样。

题目:快乐数

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> hashset = new HashSet<>();
        while(n!=1 && !hashset.contains(n)){
            hashset.add(n);
            n = getNext(n);
        }
        return n==1?true:false;
    }

    public static int getNext(int n){
        int res = 0;
        while(n>0){
            int temp = n%10;
            res += temp *temp;
            n /= 10;
        }
        return res;
    }
}

4.赎金信

题目:赎金信

这题和第一个题是一样的解法,也没什么好说的,关键就在与26个字母是个有限的空间,所以用数组会更快并且内存占用更小。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 定义一个哈希映射数组
        int[] record = new int[26];

        // 遍历
        for(char c : magazine.toCharArray()){
            record[c - 'a'] += 1;
        }

        for(char c : ransomNote.toCharArray()){
            record[c - 'a'] -= 1;
        }
        
        // 如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符
        for(int i : record){
            if(i < 0){
                return false;
            }
        }

        return true;
    }
}

因为过于简单,所以我试了试用map集合,果然是麻烦了一点,但也还好哈哈

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character, Integer> map = new HashMap<>();
        for (char c : magazine.toCharArray())
            map.put(c, map.getOrDefault(c, 0) + 1);

        for (char c : ransomNote.toCharArray()) {
            if (map.containsKey(c) && map.get(c) > 0)
                map.put(c, map.getOrDefault(c, 0) - 1);
            else
                return false;
        }
        return true;
    }
}

这里map集合用了getOrDefault()方法,但思路是和第一个解法差不多的。

用时:2h

总结:学习了哈希表的用法,数组,Set,Map的用法我在之前就比较熟悉了所以这一part学的比较轻松。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值