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

哈希表理论基础

 

哈希:又称散列,一般用于将一个分散的、杂乱的数据通过某个函数,映射到一个新的数据,而新数据往往更容易处理,比如新数据可能具有统一的长度,或者具有更小的范围,或者更紧凑,或者更方便比较等等,在java中体现为以下API:

HashMap:键不重复,值可重复;允许key和value为空;
HashTable:键不重复,值可重复;不允许key和value为空;
HashSet:排列无序,不可重复;存取速度快;内部为HashMap;

根据哈希算法的思想,最基础的数据结构之一——数组也可用作HashSet或HashMap等。在其它条件相同时,用数组作为哈希表的效率往往会更高。

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

但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!

242. 有效的字母异位词

给定两个字符串 s和 t,编写一个函数来判断 t是否是 s 的字母异位词。

输入: s = "anagram", t = "nagaram"
输出: true

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

    }
}
  1. 定义字母的数组,26个字母
  2. 将两个字符串的字母全部遍历到数组当中,一个字符串做++操作,一个字符串做 --操作
  3. 判断数组当中的是否全部为零,全部为零返回true,否则返回false

349. 两个数组的交集

给定两个数组 nums1和 nums2,返回 它们的交集。输出结果中的每个元素一定是 唯一的。我们可以 不考虑输出结果的顺序

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

 

当两个数组当中存在重复的元素,但是要求输出唯一元素,可以巧用Set值不重复的特性,去消去一个数组当中重复的元素。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        //1.判断数组为空的情况
        if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){
            return new int[0];
        }
        //2.创建两个空的HashSet,一个用于存储遍历的nums1,一个用来存储结果
        Set<Integer> numSet=new HashSet<>();
        Set<Integer> reslut=new HashSet<>();
        //3.将数组nums1添加到num1Set哈希表中
        for(int i:nums1){
            numSet.add(i);
        }
        //4.遍历nums2并判断是否包含在numSet里面,若果包含将i添加到reslut哈希表当中
        for(int i:nums2){
            if(numSet.contains(i)){
                reslut.add(i);
            }
        }
        //5.返回的结果是哈希表,需要转成数组才可
        return reslut.stream().mapToInt(x->x).toArray();

    }
}

哈希表类contains()方法:

contains()方法用于检查是否有任何键映射到给定值元素(val_ele)中 numSet.contains(i)

注意:最后得到的result是哈希表,需要将哈希表转换为int[]数组形式:

reslut.stream().mapToInt(x->x).toArray();

202. 快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

这道题的核心来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。所以可以提前定义一个函数进行求和的操作,然后while循环里面一只调用。

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

这里的循环条件是while(n!=1&&!reslut.contains(n))

n!=1是为了保证输入的不是快乐数,否则不需要判断

!reslut.contains(n) 判断哈希表中是否重复出现了计算玩的n否则,就会重复循环(即这个数不可能是快乐数,可以直接返回,避免死循环)

1. 两数之和

给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个整数,并返回它们的数组下标。

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

这道题不仅要求找到值,还要求返回数组下表,所以需要使用hashmap

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        int[] New=new int[2];
        if(nums==null||nums.length==0){
            return New;
        }
        for(int i=0;i<nums.length;i++){
            int temp=target-nums[i];
            if(map.containsKey(temp)){
                New[0]=i;
                New[1]=map.get(temp);
                break;
            }
            map.put(nums[i],i);
        }
        return New;
    }
}

Java HashMap containsKey() 方法

containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。

containsKey() 方法的语法为:hashmap.containsKey(Object key)

今日小结:

  1. 哈希表的应用情况:要快速判断一个元素是否出现集合里的时候,就要考虑哈希法
  2. 要求返回结果不重复,并且只需要获取值时可以使用HashSet
  3. 要求返回结果既要考虑到值又要考虑到索引时,需要考虑HashMap的键值对映射
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第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、付费专栏及课程。

余额充值