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

第五天是周末的休息日,嘿嘿,今天继续~

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

用哈希法的数据结构:数组、set、map
 

242.有效的字母异位词

力扣题目链接

心得:重点是了解思路,代码还是很简洁的。只需要存储26个字母,可以用数组实现。

  1)定义一个长度为26的数组,数组的下标是,每个字符char-'a'

  2)遍历字符串s,字母出现一次,则+1

  3)遍历字符串t,字母出现一次,则-1

  4)判断数组内长度是不是都为0

  5)获取字符串s中的第i个字符,s.charAt(i) 

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

349.两个数组的交集

力扣题目链接

心得:本题数据量较多,可选用set集合。整体思路不难,遍历第一个数组,存入set(set集合中不允许数据重复),遍历第二个数据,判断set集合中是否包含。重点要熟悉java中set集合相关语法。

  1)初始化指定参数类型的set,Set<Integer> set = new HashSet<>()

  2)添加数据,set.add()

  3)判断集合中是否有某个元素,set.contains()

  4)set集合转换为int数组,set.stream().mapToInt(x -> x).toArray()

复制代码
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer>  set2 = new HashSet<>();
        for(int i=0;i<nums1.length;i++){
            set1.add(nums1[i]);
        }
        for(int i=0;i<nums2.length;i++){
            if(set1.contains(nums2[i])){
                set2.add(nums2[i]);
            }
        }
        return set2.stream().mapToInt(x -> x).toArray();
    }
}
复制代码

202.快乐数

力扣题目链接

心得:核心是抓住题目中的“无限循环”,就是说求和的过程中,sum会重复出现。有了思路,实际敲代码中需要对计算熟悉,能够求出每个位置上的数字的平方和。

复制代码
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        System.out.println("n");
        while(!set.contains(n)){
            set.add(n);
            System.out.println("n");
            n = sumSquares(n);
            if(n == 1){
                return true;
            }
        }
        return false;
    }
    int sumSquares(int n){
            int sum = 0;
            while(n != 0){
                int a = n%10;
                sum = sum+a*a;
                n = n/10;
            }
            return sum;
        }
}
复制代码

1.两数之和

力扣题目链接

心得:我们不仅要知道元素有没有遍历过,还有知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。在遍历数组的时候,只需要向map去查询是否有和目前遍历元素比配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中。重点要熟悉java中map集合相关语法。

  1)初始化指定参数类型的map,Map<Integer,Integer> map = new HashMap<>()

  2)添加元素,map.put(key,value)

  3)获取元素,map.get(key)

  4)判断集合是否包含某个key,map.containsKey(key)

复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int diff = target-nums[i];
            if(map.containsKey(diff)){
                result[0] = map.get(diff);
                result[1] = i;
                break;
            }
            map.put(nums[i],i);
        }
        return result;
    }
}
复制代码

 

posted @   橙子的房东  阅读(216)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示