day6 | 哈希表(1)

什么时候能用到哈希表呢?

给你一个元素,判断这个元素在集合中是否出现过。

什么时候用set?

数值很大,数值分布很分散,用数组下标来进行映射就会浪费很大的存储空间

 

题目链接:242. 有效的字母异位词 - 力扣(LeetCode)

题目描述:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词

解题思路:参考文章:代码随想录 (programmercarl.com)

 1 class Solution {
 2     public boolean isAnagram(String s, String t) {
 3         //创建一个record数组,用于记录每个字符串中字母出现的个数
 4         int[] record = new int[26];
 5         for (int i = 0 ;i < s.length();i++){
 6             record[s.charAt(i)-'a']++;
 7         }
 8         for (int j =0 ;j<t.length();j++){
 9             record[t.charAt(j)-'a']--;
10         }
11         for(int i = 0;i<26;i++){
12             if(record[i]!=0) return false;
13         }
14         return true;
15     }
16 }

 

 

题目链接349. 两个数组的交集 - 力扣(LeetCode)

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

解题思路:

 1 class Solution {
 2     public int[] intersection(int[] nums1, int[] nums2) {
 3         if (nums1 == null || nums2==null){
 4             return new int[0];
 5         }
 6         //创建两个set,一个用于存储nums1中所有的数据,即set1;
 7         //一个用于存储两个数组交集的数据,即reSet
 8         Set<Integer> set1 = new HashSet<>();
 9         Set<Integer> reSet = new HashSet<>();
10         //遍历nums1
11         for(int i : nums1){
12             set1.add(i); //add函数,是java.util.Set接口中的函数,如果 set 中尚未存在指定的元素,则添加此元素
13         }
14         for (int i : nums2){
15             if(set1.contains(i)){// contains(): 如果 set 包含指定的元素,则返回 true。
16                 reSet.add(i);
17             }
18         }
19         //将结果几何转换为数组
20         return reSet.stream().mapToInt(x -> x).toArray();
21     }
22 }

 

题目链接:202. 快乐数 - 力扣(LeetCode)

题目描述:

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

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

解题思路:  

 1 class Solution {
 2     //取数字各个位上的单数之和
 3     public int getSum(int n){
 4             int sum=0;
 5             while(n>0){
 6                 sum += (n%10)*(n%10);
 7                 n/=10;
 8             }
 9             return sum;
10         }
11     public boolean isHappy(int n) {
12         Set<Integer> record=new HashSet<>();
13         while (n!=1 && !record.contains(n)){
14             //当集合中重复出现sum或者sum=1时会跳出循环
15             record.add(n);
16             n=getSum(n);
17         }
18         return n==1;
19     }
20 }

 

题目链接:1. 两数之和 - 力扣(LeetCode)

题目描述:

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

解题思路:

1.创建一个map集合,用于保存遍历过的数据

2.遍历数组nums[ ],如果找到  temp = target-nums[i] map集合中有temp,说明map集合中有一个加数能与当前的nums[i]相加得到target满足题意。

3.如果map中没有符合条件的key,就把当前的 nums[i] 存入map中。

 1 class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         //创建数组,用于保存输出结果
 4         int[] res = new int[2];
 5         if(nums==null||nums.length==0){
 6             return res;
 7         }
 8         Map<Integer,Integer> map = new HashMap<>();
 9         for(int i=0 ; i<nums.length ; i++){
10             int temp = target-nums[i];
11             if(map.containsKey(temp)){//如果在map中能够找到匹配的key
12                 res[0]=map.get(temp);//res[key(元素),value(下标)]
13                 res[1]=i;
14                 break;
15             }
16             map.put(nums[i],i);
17         }
18     return res;
19     }
20 }

 

posted @ 2023-02-16 22:16  Inbreak  阅读(21)  评论(0)    收藏  举报