刷题时常见的哈希结构有三种:数组,set, map
其中,数组作为哈希表的前提是,知道总共有多少种情况,比如这道题
这道题可以使用数组来做哈希表,因为字母的个数是固定的,总共有26个英文字母,数组大小就为26
public boolean isAnagram(String s, String t) {
int []arr = new int[26];
for(char ch:s.toCharArray()){
arr[ch-'a']++;
}
for(char ch:t.toCharArray()){
arr[ch-'a']--;
}
数组中若有值不为0,说明S中有的词t中没有,或者t有s没有
for(int num:arr){
if(num!=0) return false;
}
return true;
}
public boolean canConstruct(String ransomNote, String magazine) {
int []arr = new int[26];
for(char ch:ransomNote.toCharArray()){
arr[ch-'a'] ++;
}
for(char ch:magazine.toCharArray()){
arr[ch-'a']--;
}
若数组中有大于等于1的值,说明magazine中没有这个字母或是字母数不够
for(int x:arr){
if(x>=1) return false;
}
return true;
}
使用set作哈希表的题目中,数的数量是不确定的,因此不可以使用数组,或者题中要求有的数不可以重复出现,或者判断该数是否出现过![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/89c4975fb0a1d06781c208cc64030bae.png)
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n!=1){
int sum = 0;
while(n!=0){
sum += (n%10)*(n%10);
n /= 10;
}
n = sum;
if(set.contains(n)) return false;
set.add(n);
}
return true;
}