代码随想录算法训练营第六天 | 242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和

哈希表主要用来解决判断元素是否出现在集合中的问题。

有效的字母异位词

题目链接:242. 有效的字母异位词

用数组模拟哈希,数组的0到25位存储字母,第一个字符串让数组对应的位置++,第二个字符串让对应的位置--,最后判断数组是否都为0,如果是,说明是字母异位词,否则说明不是。

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

两个数组的交集

题目链接:349. 两个数组的交集

解题思路:set作为哈希结构存储元素

  • 先定义一个set结构的哈希表存储数组1中的元素
  • 如果哈希表中包含数组2中的元素,则将数组2的这个元素放入结果set中,方便去重
  • 通过stream流将set集合转换为数组输出
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> hash = new HashSet();
        Set<Integer> res = new HashSet();
        for(int num1 : nums1){
            hash.add(num1);
        }
        for(int num2 : nums2){
            if(hash.contains(num2)){
                res.add(num2);
            }
        }
        return res.stream().mapToInt(x -> x).toArray();
    }
}

快乐数

题目链接:202. 快乐数

两个知识点,一是无限循环需要将判断这个数是否出现过,二是计算一个数各个位置平方和的下一个数。

public boolean isHappy(int n) {
    //无限循环说明这个数出现过
    HashSet<Integer> record = new HashSet<>();
    //如果n不等于1或者没有出现过,一直循环
    while (n != 1 && !record.contains(n)){
        //将这个数记录下来
        record.add(n);
        n = getNextNumber(n);
    }
    return n == 1;
}

private int getNextNumber(int n) {
    int res  = 0;
    while (n > 0){
        //余数
        int temp = n % 10;
        res += temp * temp;
        //除数
        n = n / 10;
    }
    return res;
}

两数之和

题目链接:1. 两数之和

判断元素在一个集合中是否出现过,使用哈希表的数据结构。

这里使用map的哈希表结构,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        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++){
            if(map.containsKey(nums[i])){
                res[0] = map.get(nums[i]);
                res[1] = i;
                break;
            }
            map.put(target - nums[i], i);
        }
        return res;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值