什么时候能用到哈希表呢?
给你一个元素,判断这个元素在集合中是否出现过。
什么时候用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 }
标签:哈希,nums,day6,int,数组,new,nums1,record From: https://www.cnblogs.com/inbreak/p/17056700.html