我真的服了,我再也不会吃学校外面的鱿鱼了。gou都不吃!!!!!虽然很香,但是很窜啊。受不了了。
ok话不多说,进入流程
吾日三省吾身
比那个男人帅吗?
比那个男人爱她吗?
比那个男人有实力吗?
省毕,学习
今天直接来到了哈希表的章节了,感觉是挺快的,这是因为前面的数组和链表的操作都还挺简单的。等到后面学习二叉树的时候就真的有点裂开了,我也不确定能不能一天一更了。
Hash表简介
其实常见的hash表很多只要你学过Java基础就应该知道了。比如数组,集合中的set和map,这里就不提具体的实现类了。这些都挺好用。
使用哈希表的场景
一般使用哈希表都是在比如根据什么东西去查询什么东西,这种就是哈希表的标准使用场景。
力扣题号:242. 有效的字母异位词
下述题目描述和示例均来自力扣
题目描述:
给定两个字符串
s
和t
,编写一个函数来判断t
是否是s
的字母异位词。注意:若
s
和t
中每个字符出现的次数都相同,则称s
和t
互为字母异位词。
示例
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true示例 2:
输入: s = "rat", t = "car" 输出: false
思路
Java解法一:采用Map集合作为哈希表
其实这个法子我是第一个想到的,因为map的key存字母,然后value存字母出现的次数真的是太适合map的key和value结构了。先存,再删,然后判断只要数量小于0了,直接false
这里在说一下一个map集合的API,getOrDefault(key, defaultValue),他第一个值填一个元素,第二个值填默认元素,然后会去map中找第一个元素,有的话返回value,没有就返回默认值。
class Solution {
public boolean isAnagram(String s, String t) {
//还是先转为字符数组
char[] charS = s.toCharArray();
char[] charT = t.toCharArray();
//长度不同返回false
if (charS.length != charT.length){
return false;
}
//开始存入map集合,key是字母,value是字母出现的次数
//记住了,map的泛型里面是引用类型不是基本数据类型
HashMap<Character, Integer> map = new HashMap<>();
//开始遍历s存数
for (int i = 0; i < charS.length; i++) {
map.put(charS[i],map.getOrDefault(charS[i],0) + 1);
}
//减少次数
for (int i = 0; i < charT.length; i++) {
if (map.containsKey(charT[i])) {
//有,次数(value)减一
map.replace(charT[i],map.get(charT[i]) - 1);
if (map.get(charT[i]) < 0){
//数量不够,错
return false;
}
}else {
//这里就意味着根本就不包含这个字母
return false;
}
}
return true;
}
}
该说不说,能过是能过,但是还是太慢了,不知道我这个代码有没有优化的空间啊。欢迎各位大侠讨论
Java解法二:采用数组作为哈希表
虽然说Java通过charAt也可以操作字符串中的每一个字符,但是过于麻烦,而且这里也不需要返回字符串,操作完也不用重新给拼接回去,所以直接转成数组方便操作。
将charS中的字符存入hash表这里hash表采用数组,为什么使用数组呢=》set一般用于重复的去重,map常用于需要存储多个元素的这里使用map我觉得也行,key是字母,value是数量,使用数组的话就定义26个字母,分别代表a-z,然后数组值代表每个字母出现的数量
class Solution {
public boolean isAnagram(String s, String t) {
//先将他俩转换成char数组方便操作
char[] charS = s.toCharArray();
char[] charT = t.toCharArray();
//长度都不一样还解释啥啊错了bro
if (charS.length != charT.length){
return false;
}
//然后将charS中的字符存入hash表
//这里采用数组,set一般用于重复的去重
//map常用于需要存储多个元素的
//这里使用map我觉得也行,key是字母,value是数量
//使用数组的话就定义26个字母,分别代表a-z,然后数组元素代表每个字母出现的数量
int[] res = new int[26];
//遍历charS
for (int i = 0; i < charS.length; i++) {
res[charS[i] - 'a']++;
}
//然后遍历charT删除res中的元素
for (int i = 0; i < charT.length; i++) {
res[charT[i] - 'a']--;
if (res[charT[i] - 'a'] < 0){
return false;
}
}
return true;
}
}
速度直接打败了全世界人!!!!!!!!!!!
但是这里就暴露出来的哈希表的缺点,因为要额外的开辟空间存储一些东西,所以内存一般占得多,但是够快。内存和速度的取舍就看具体情况了。
哈哈哈哈哈哈哈哈哈哈哈哈,害,哈希表的题也就这样吧,简简单单随随便便的啦~~
ε=(´ο`*))),所以数组那么多年了但是知根知底,map刚刚认识但是不知底细。好像map很好相处,所以你会放弃数组选择map吗?就像你会放弃你现在身边的那个人选择新闯入你生活的这个人吗?我不会,期待你也不会
see you
记得每日三省~~