哈希表
哈希表是一种时间复杂度只有O(1)的查找数据结构
哈希函数的设置主要遵循以下几个条件:
(1)函数的结果要在可取空间范围内,并且计算的结果可以取到空间内的任意一块地址
(2)哈希函数计算出来的地址应均匀分布在空间内
力扣算法题
242. 有效的字母异位词**
做题出现两个问题:
1、i=i++和i++的区别
链接:i=i++深入解释-CSDN博客
2、数组的初始化创建:
int res[26]={0}
题目如下:
//解法一:用hashMap记录统计数量
public boolean isAnagram(String s, String t) {
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Map<Character,Integer> map = new HashMap<>();
for(char c: str1){
map.put(c,map.getOrDefault(c,0)+1);
}
for(char f:str2){
map.put(f,map.getOrDefault(f,0)-1);
}
Iterator<Character> iterator = map.keySet().iterator();
while(iterator.hasNext()){
char key = iterator.next();
if(map.get(key)!=0){
return false;
}
}
return true;
}
//解法2:用26长度的数组
public boolean isAnagram(String s, String t) {
int res[26] = {0};
for(int i = 0;i<s.length();i++){
res[s.charAt(i)-'a']=res[s.charAt(i)-'a']+1;//也可写为:res[s.charAt(i)-'a']++
}
for(int i = 0;i<t.length();i++){
res[t.charAt(i)-'a']=res[t.charAt(i)-'a']-1; //也可写为:res[s.charAt(i)-'a']--;
//注意i++与i=i+1等通,而i=i++不对
}
for(int k:res){
System.out.println(k);
if(k!=0){
return false;
}
}
return true;
}
349. 两个数组的交集
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
List<Integer> list = new ArrayList<>();
for(int k:nums1){
set.add(k);
}
for(int p:nums2){
if(set.contains(p)){
list.add(p);
set.remove(p);//避免返回结果重复值,另外方法,直接创建set即可去重
}
}
int i = 0;
int[] res = new int[list.size()];
for(int tt:list){
res[i++]=tt;
}
return res;
}
拓展:
//将set集合转为数组
return resSet.stream().mapToInt(x -> x).toArray();
202. 快乐数
本题的思路:(1)【也可能是 无限循环 但始终变不到 1】转换为代码:如果之前出现过相同的和就返回false,
(2)求整数的每一位数【一定要区分取余%与/区别】
(3)求每个数的和
//求整数没一位数
int n = 344;
while(n!=0){
int temp = n%10;
n = n/10;
}
//本题代码-自己写的
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
if(n==1){
return true;
}
while(n!=0){//求每一位的和
int sum=0;
while(n!=0){
int temp =n%10;
sum = sum+temp*temp;
n = n/10;
}
if(set.contains(sum)){
return false;
}else{
set.add(sum);
}
if(sum==1){
return true;
}
n=sum;
}
return false;
}
//别人写的
public boolean isHappy(int n) {
Set<Integer> record = new HashSet<>();
while (n != 1 && !record.contains(n)) {
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n) {
int res = 0;
while (n > 0) {
int temp = n % 10;
res += temp * temp;
n = n / 10;
}
return res;
}
167. 两数之和 II - 输入有序数组
思路:hashMap方法做即可,先放进map,一次找map中是否存在target与当前遍历的值的差值
public int[] twoSum(int[] numbers, int target) {
int n = numbers.length;
Map<Integer,Integer> map = new HashMap<>();
int[] res = new int[]{0,0};
for(int i = 0;i<n;i++){
int temp = target-numbers[i];
if(map.containsKey(temp)){
System.out.println(temp);
return new int[]{map.get(temp)+1,i+1};
}else{
map.put(numbers[i],i);
}
}
return res;
}
//以下是Map接口中的一些常用方法:
put(K key, V value);// 向Map中添加或更新一个键值对。如果Map中已经存在该键,则对应的值会被更新。
get(Object key): 根据键从Map中获取对应的值。如果Map中不存在该键,则返回null。
remove(Object key): 从Map中删除指定键的键值对,并返回被删除的值。如果Map中不存在该键,则返回null。
containsKey(Object key): 检查Map中是否存在指定的键。
containsValue(Object value): 检查Map中是否存在指定的值。
isEmpty(): 检查Map是否为空。
size(): 返回Map中的键值对的数量。
clear(): 清除Map中的所有键值对,使Map为空。
keySet(): 返回Map中所有键的集合。
for (Entry entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
}
values(): 返回Map中所有值的集合。
entrySet(): 返回Map中所有键值对的集合。