学习目标:
1. 哈希表:数组
2. 哈希表:Set集合
3. 哈希表:Map集合
1.哈希表:数组
在没细细了解哈希表的概念之前,这道题的算法我以为只是一个基础算法,没想到涉及了哈希表,属于哈希表中的数组,特点是ascii码连续且长度有限制。
这道题解法简单,数组先记录s字符串出现几次位置+几个,然后记录t字串出现几次位置-几个。位置上都是0就是刚好抵消。
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for(int i =0;i<s.length();i++){
record[s.charAt(i) - 'a']++;
}
for(int i =0;i<t.length();i++){
record[t.charAt(i) - 'a']--;
}
for(int x:record){
if(x!=0) return false;
}
return true;
}
}
2.哈希表:Set集合
Set集合的优点在于查找字符编码杂乱,并且数据跨度大的数据的内存空间不会浪费大,但是相比数组的查询速度会慢一些,特别是如果题目没有限制数据的长度的话,相对数组用Set集合会更好,但这道题限制了数据,可以用哈希表数组解法,但是上一题已经用过了,这里就不再写了,大体是差不多的。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
Set<Integer> res = new HashSet<>();
for(int x : nums1) set.add(x);
for(int x : nums2) {
if(set.contains(x)) res.add(x);
}
int[] arr = new int[res.size()];
int index = 0;
for(int x :res){
arr[index++] = x;
}
return arr;
}
}
3.快乐数
这题没什么好说的和上题一样。
class Solution {
public boolean isHappy(int n) {
Set<Integer> hashset = new HashSet<>();
while(n!=1 && !hashset.contains(n)){
hashset.add(n);
n = getNext(n);
}
return n==1?true:false;
}
public static int getNext(int n){
int res = 0;
while(n>0){
int temp = n%10;
res += temp *temp;
n /= 10;
}
return res;
}
}
4.赎金信
这题和第一个题是一样的解法,也没什么好说的,关键就在与26个字母是个有限的空间,所以用数组会更快并且内存占用更小。
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
// 定义一个哈希映射数组
int[] record = new int[26];
// 遍历
for(char c : magazine.toCharArray()){
record[c - 'a'] += 1;
}
for(char c : ransomNote.toCharArray()){
record[c - 'a'] -= 1;
}
// 如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符
for(int i : record){
if(i < 0){
return false;
}
}
return true;
}
}
因为过于简单,所以我试了试用map集合,果然是麻烦了一点,但也还好哈哈
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character, Integer> map = new HashMap<>();
for (char c : magazine.toCharArray())
map.put(c, map.getOrDefault(c, 0) + 1);
for (char c : ransomNote.toCharArray()) {
if (map.containsKey(c) && map.get(c) > 0)
map.put(c, map.getOrDefault(c, 0) - 1);
else
return false;
}
return true;
}
}
这里map集合用了getOrDefault()方法,但思路是和第一个解法差不多的。