哈希表
- 简介
- 242. 有效的字母异位词
- 349. 两个数组的交集
- 202. 快乐数
简介
记录一下自己刷题的历程以及代码,会尽量把在本地测试包含main
函数的完整代码贴上,以及一些注释掉的输出语句。写题过程中参考了 代码随想录。会附上一些个人的思路,如果有错误,可以在评论区提醒一下。
242. 有效的字母异位词
原题链接
最容易想到的就是开两个 26 大小的数组分别做字符统计,然后比较,稍微简化一些可以在单个数组上做统计比对。
这道题放在哈希表系列之下,我想s.charAt(i) - 'a'
就是一种hashFunction()
,把每个字符对应到一个数组下标从而进行统计
class Solution {
public boolean isAnagram(String s, String t) {
int[] count = new int[26];
for(int i = 0; i < s.length(); i++){
count[s.charAt(i) - 'a']++;
}
for(int i = 0; i < t.length(); i++){
count[t.charAt(i) - 'a']--;
}
for(int i = 0; i < 26; i++){
if(count[i] != 0) return false;
}
return true;
}
}
349. 两个数组的交集
原题链接
方法①:使用HashSet
写起来方便,效率比较低
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set1 = new HashSet<>();
HashSet<Integer> set2 = new HashSet<>();
for( int i : nums1){
set1.add(i);
}
for( int i : nums2){
if(set1.contains(i)){
set2.add(i);
}
}
return set2.stream().mapToInt(x -> x).toArray();
}
}
方法②:List + 数组遍历
public int[] intersection(int[] nums1, int[] nums2) {
int[] count1 = new int[1001];
int[] count2 = new int[1001];
List<Integer> ansList = new ArrayList<>();
for(int i = 0; i < nums1.length; i++){
count1[nums1[i]]++;
}
for(int i = 0; i < nums2.length; i++){
if(count1[nums2[i]] != 0 && count2[nums2[i]] == 0){
count2[nums2[i]]++;
ansList.add(nums2[i]);
}
}
int ans[] = new int[ansList.size()];
int index = 0;
for(int i : ansList){
ans[index++] = i;
}
return ans;
}
方法①和方法②的效率差距
202. 快乐数
原题链接
题目中说不是快乐数的情况下,sum
会一直循环,也就是当sum
重复出现的时候,他就不会是一个快乐数了(这个我感觉题面上给的不是很直接),那么只要对sum
出现的情况做统计,就可以判断n
是否是快乐数。
方法①:在数组上进行统计,int
类型最大值 2147483645
最大的情况下也就是十位数,每一位平方总和不会大于 9 * 9 *10
;
class Solution {
public boolean isHappy(int n) {
int[] count = new int[850];
while(n != 1){
int sum = 0;
while(n > 0){
sum += (n % 10) * (n % 10);
n = n / 10;
}
if(count[sum] != 0) return false;
count[sum]++;
n = sum;
}
return true;
}
}
方法②:利用HashSet做统计,HashSet不会储存重复的元素。
class Solution {
public boolean isHappy(int n) {
HashSet<Integer> set = new HashSet<>();
while(n != 1){
int sum = 0;
while(n > 0){
sum += (n % 10) * (n % 10);
n = n / 10;
}
if(set.contains(sum)) return false;
set.add(sum);
n = sum;
}
return true;
}
}