这个知识点陌生,故形式写成知识点+题目(ps:今天只写了三个题,想打lol了,最后一个题暂时放弃)
总用时:1:53
1.hash表类型:
hash概念不再赘述,可以理解成数组;
主要包含三个重要的应用:
- 数组
- set (集合)
- map(映射)
今天只学了前两种,数组和set;
1.1数组:
数组比较简单,主要应用就是将数组下标作为出现的数字,用key【i】记录次数,这可能就会涉及到hash表的无限长度问题。
无长度限度,可以用数组,如:力扣242;
package day6;
class Solution {
public boolean isAnagram(String s, String t) {
int []record=new int[26];
//补充:charAt;返回字符串指定位置字母;
for(int i=0;i<s.length();i++){
//每一步遍历字符串,让该字符串个数++
record[s.charAt(i)-'a']++;
}
for(int j=0;j<t.length();j++){
//每一步遍历字符串,让该字符串个数++
record[t.charAt(j)-'a']--;
}
for(int k:record){
if(k!=0)
return false;
}
return true;
}
public static void main(String[] args) {
Solution p=new Solution();
// p.isAnagram()
}
}
//总结:hash表初步用法,数组本身就是hash表
1.2set集合的使用
这个使用有个关键点,集合的不重复性,当题目涉及到这个点,即可以考虑使用
这里的映射关系非常秒,运用set类直接帮助去重,然后使用该set判断是否在第二个数组中存在
内部的一些语法比较重要:java版
(1)创建set:
Set<Integer> set1 = new HashSet<>();
(2)添加到set:
set1.add()
(3)比较set:
set1.contains()
(4)转化回数组:(较为复杂)
return resSet.stream().mapToInt(x -> x).toArray();
该题目的总代码如下:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//这是我想不到的特殊条件(其实其他的也没想到)
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
return new int[0];
}
//思路:用Set<Integer> set1 = new HashSet<>();,set映射去重,然后直接比较两个set表;
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
for(int i:nums1){
set1.add(i);
}
for(int j:nums2){
if(set1.contains(j)){
set2.add(j);
}
}
int []arr=new int[set2.size()];
int j=0;
for(int i:set2){
arr[j++]=i;
}
return arr;
}
}
如上,共勉。