【代码随想录训练营】Day6-哈希表

代码随想录 Day6

今日任务

242.有效的字母异位词
349.两个数组的交集
202.快乐数
1.两数之和
语言:Java

242. 有效的字母异位词

考点:哈希表(数组)
链接:https://leetcode.cn/problems/valid-anagram/
进阶:如果输入包括Unicode编码的字符,该怎么办?
明确:ASCⅡ用1个字节表示一个字符,Unicode用2个字节表示一个字符,所以在Unicode编码下,不能使用数组作为哈希表,而应该用map作为哈希表

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length()){
            return false;
        }
        int[] s_record = new int[26];
        int[] t_record = new int[26];
        for(int i = 0; i < s.length(); i++){
            s_record[(s.charAt(i) - 'a') % 26]++;
            t_record[(t.charAt(i) - 'a') % 26]++;
        }
        for(int i = 0; i < 26; i++){
            if(s_record[i] != t_record[i]){
                return false;
            }
        }
        return true;
    }
}

【代码随想录训练营】Day6-哈希表_第1张图片
这里有个Java使用的小注意事项,是看其他同学问问题了解到的,如果使用Integer比较值时最好用 equals 而不是直接用 ==【代码随想录训练营】Day6-哈希表_第2张图片

349. 两个数组的交集

考点:哈希表
链接:https://leetcode.cn/problems/intersection-of-two-arrays/

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set2 = new HashSet();
        for(Integer i: nums2){
            set2.add(i);
        }
        Set<Integer> find = new HashSet();
        for(int i = 0; i < nums1.length; i++){
            if(set2.contains(nums1[i])){
                find.add(nums1[i]);
            }
        }

		//将Set转为int型数组需要通过Integer数组中转一下
        Integer[] temp = find.toArray(new Integer[]{});
        int[] result = new int[temp.length];
        for(int i = 0; i < temp.length; i++){
            result[i] = temp[i].intValue();
        }
        return result;
    }
}

【代码随想录训练营】Day6-哈希表_第3张图片

202. 快乐数

考点:哈希表
链接:https://leetcode.cn/problems/happy-number/
解题思路:这道题的关键并不在于判断最终和是否等于1,而是在于非快乐数的循环终止条件。根据题目描述我们发现这样一句话 “or it loops endlessly in a cycle which does not include 1”,提醒了我们如果是一个非快乐数,那么它最终会以某种和不包含1的方式无限循环,从而理所当然地想到了使用Set,因为Set中不允许有重复元素,可以通过Set自带的contains方法轻易地判断求出的和在此前是否出现过。

class Solution {
    public boolean isHappy(int n) {
        int[] record = new int[10];
        Set loop = new HashSet();
        while(loop.contains(n) == false){
            loop.add(n);
            int sum = 0;
            while(n != 0){
                sum += (n % 10) * (n % 10);
                n /= 10;
            }
            n = sum;
            if(n == 1){
                return true;
            }
        }
        return false;
    }
}

【代码随想录训练营】Day6-哈希表_第4张图片

1. 两数之和

考点:哈希表
链接:https://leetcode.cn/problems/two-sum/
解题思路:题目中说 “have exactly one solution”,所以我们可以放心地遍历,一定会找到一对数字符合条件。因为我们要找的是两数之和为target,所以每经过一个数字的时候都要判断下此前是否有符合条件的数字可以让两数之和为target;因此map的key就用来存放具体的数字,而题目要求返回数组下标,map的value也就用来存放数字对应下标。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
                HashMap<Integer, Integer> record = new HashMap<Integer, Integer>();
        for(int i = 0 ; i < nums.length; i++){
            if(record.get(target - nums[i]) != null){
                result[0] = i;
                result[1] = record.get(target - nums[i]);
                break;
            }
            else{
                record.put(nums[i], i);
            }
        }
        return result;
    }
}

【代码随想录训练营】Day6-哈希表_第5张图片

你可能感兴趣的:(代码随想录训练营,leetcode,java,哈希表)