代码随想录打卡day6

本文介绍了如何在Java编程中利用HashMap和HashSet解决字母异位词、数组交集、快乐数和两数之和等题目,强调了哈希法在查询元素存在性和存储下标方面的优势,以及数组和Set的局限性。
摘要由CSDN通过智能技术生成

242.有效的字母异位词

这道题主要是引入一下hashmap,主要就是两个字符串判断其26个字母存储到哈希表后最后个数是否相同

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 count: record){
            if(count!=0){
                return false;
            }
        }
        return true;
    }
}

349. 两个数组的交集

主要是什么时候用set 什么时候用数组做hash,数组是用下标做key所以最好数字药效,set是去重时用。然后就是HashSet Set的S是大写 然后有add contains方法

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

        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;

    }
}

第202题. 快乐数

主要是判断sum有没有出现过,这样就可以判断有没有出现死循环!!!

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

1. 两数之和

主要是学到什么时候用map,然后这题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(target-nums[i])){
                res[0]=map.get(target-nums[i]);
                res[1]=i;
                break;
            }
            map.put(nums[i], i); 
        }
        return res;

    }
}

首先我再强调一下 什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。

那么我们就应该想到使用哈希法了。

因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适

再来看一下使用数组和set来做哈希法的局限。

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值