代码随想录算法训练营 DAY5---备战秋招

主题:哈希表

哈希表基础复盘

哈希表及其基础

刷题:

242.有效的字母异位词

图文讲解代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE视频讲解学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1YG411p7BA/题目及个人题解

242.有效的字母异位词
//方法一:哈希表 采用数组 
public boolean isAnagram(String s, String t) {

        //思路:创建一个26长度的数组表示英文字母,对进行s统计次数,然后与t比较--

        int[] res=new int[26];

        int length=s.length();

        for(int i=0;i<length;i++){
            res[s.charAt(i)-'a']++;
        }
        for (int j=0;j<t.length();j++){
            res[t.charAt(j)-'a']--;
        }
        for(int count:res){
            if(count!=0){
                return false;
            }
        }
        return true;

}
//方法二:暴力 双层for循环 不推荐 比较简单,偷个懒不写啦

个人总结

这道题很好的锻炼了哈希表的应用,难度不大。需要注意的是,在使用哈希表中我们可能涉及到数组,set,list,map这些数据结构,要掌握对应数据结构的常用方法

//方法一:思路是先采用set集合去重,再找交集
public int[] intersection(int[] nums1, int[] nums2) {

        Set<Integer> first=new HashSet<>();
        for(int num:nums1){
            first.add(num);
        }

        Set<Integer> second=new HashSet<>();
        for(int num:nums2){
        //在这一步进行交集判断,相交放入
            if(first.contains(num)){
                second.add(num);
            }
        }

    //可以优化为for循环
        //如果数据在1万以内的话,for循环效率高于foreach和stream;
        // 如果数据量在10万的时候,stream效率最高,
        // 其次是foreach,最后是for。
        // 另外需要注意的是如果数据达到100万的话,parallelStream异步并行处理效率最高,高于foreach和for。

        //int[] res=new int [second.size()];
        //int j=0;
        //for(int num::second){
        //    res[j++]=num;
        //}
        //return res;
    return second.stream().mapToInt(Integer::valueOf).toArray();

}
//方法二:采用数组,因为数据量被限制,但不推荐,实现简单,偷个懒不写啦

个人总结

这道题中涉及到set的使用,set会对数据进行去重,通过去重后的数据,我们可以找到交集,放入对应set中。有一个注意的点,就是优化方面,数据量小的情况下for循环效率高于stream。

202. 快乐数

图文讲解代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html#%E6%80%9D%E8%B7%AF题目及个人题解

202.快乐数
public boolean isHappy(int n) {
    //思路:如果是快乐数,那就意味着不会出现重复,也就是循环;反之,非快乐数,就会出现重复的结果
        Set<Integer> set=new HashSet<>();
    //对下面这部分代码进行简洁优化
        //int k=n;
        //while(1>0){
          //  int a=reInt(k);
            //if(a==1){
              //  return true;
           // }
            //if(set.contains(a)){
              //  return false;
            //}else{
              //  set.add(a);
                //k=a;
            //}
       // }



       while(n!=1&&!set.contains(n)){
            set.add(n);
            n=reInt(n);
        }
        return n==1;
}

public static int reInt(int target){
        int sum=0;
        while (target/10!=0){
            int k=target%10;
            sum+=k*k;
            target/=10;
        }
        sum+=target*target;
        return sum;
    }

个人总结

这道题的核心在于找到是否循环,如果过程中出现了相同结果,则会议桌循环下去。我们可以判断每次结果是否在set中,在的话说明会循环返回false,反之将每次结果放入到set中,直到结果==1。

1.两数相加

图文讲解代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

视频讲解梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1aT41177mK/

题目及个人题解

1.两数相加

public int[] twoSum(int[] nums, int target) {
    int[] res=new int [2];
    if(nums==null||nums.length==0){
        return res;
    }

    //key存放数值 value存放索引
        //思路是 先判断map中是否含有目标值,没有的话就可以将当前数据加入到map,而不是一开始直接扫描所有数据到map中
        //为什么这么做呢?是因为可能有重复数值的出现,如果数组中有两个3,target=6,直接扫描的话map中的第一个3会被后一个覆盖掉
    Map<Integer,Integer> hashMap=new HashMap<>();
    for(int i=0;i< nums.length;i++){
        if(hashMap.containsKey(target-nums[i])){
            res[0]=i;
            res[1]=hashMap.get(target-nums[i]);
            break;
        }else{
            hashMap.put(nums[i],i);
        }
    }

    return  res;
    }

个人总结

两数相加采用了map数据结构,其中containsKey(),put()函数需要掌握。

整体算法中没有一开始就将数据全部扫描到map中,而是先判断map中有无我们想要的值,无的话,将当前值放入map,反之返回对应数据。为什么怎么做呢?

举个例子 nums = [3,3], target = 6 如果我们先扫描会出现第一个3的索引会被第二个3覆盖掉。

个人鸡汤

一具体就深刻。

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值