LeetCode——哈希表(Java)

哈希表

  • 简介
  • 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;
    }
}

你可能感兴趣的:(算法分析与设计,leetcode,散列表,java)