• Leetcode刷题Day5休息 & Day6----------哈希表


    Leetcode刷题Day5休息 & Day6----------哈希表

    1. 哈希表理论基础

    数组、Set、Map
    如果数据量小------------数组
    如果数据量大------------Set
    如果有Key、value------------Map

    • 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
    2. 有效的字母异位词 (242)
    • 题目链接:https://leetcode.cn/problems/valid-anagram/
    • 文章讲解: https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html
    • 视频讲解:https://www.bilibili.com/video/BV1YG411p7BA/?vd_source=1fb98c05c7fbfd06713f014ea5079d5b

    思路

    1. 分别统计两个字符串每个字母出现的次数,看是否相同。
    2. 数据量小---------使用数组
    class Solution {
        public boolean isAnagram(String s, String t) {
            int[] ints=new int[26];
            for(int i=0;i<s.length();i++){
                ints[s.charAt(i)-'a']++;
            }
            for(int i=0;i<t.length();i++){
                ints[t.charAt(i)-'a']--;
            }
            for(int i=0;i<ints.length;i++){
                if(ints[i]!=0) return false;
            }
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    3. 两个数组的交集 (349)
    • 题目链接: https://leetcode.cn/problems/intersection-of-two-arrays/
    • 文章讲解/视频讲解:https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html

    思路

    1. 用把第一个数组的数据加到Set1里 在Set1里查是否有数组2的元素,把有的数据在放到Set2里(避免重复) 将Set2转成数组
    2. set2.stream().mapToInt(x -> x).toArray();
      Javadoc链接:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
    class Solution {
        public int[] intersection(int[] nums1, int[] nums2) {
            Set<Integer> set=new HashSet<>();
            Set<Integer> set2=new HashSet<>();
            int[] ints=new int[Math.max(nums2.length,nums1.length)];
    
            for(int i=0;i<nums1.length;i++){
                set.add(nums1[i]);
            }
            for(int i=0;i<nums2.length;i++){
                if(set.contains(nums2[i])){
                    set2.add(nums2[i]);
                } 
            }
            return set2.stream().mapToInt(x -> x).toArray();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    4. 快乐数 (202)
    • 题目链接: https://leetcode.cn/problems/happy-number/
    • 文章讲解:https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html

    思路

    • 循环说明了要用Set,看是否存在
    • while循环终止的条件:n==1 或者n成为了循环数,所以在循环外判断是否等于1来判断是否是快乐数。因为存在一种成为循环数了但不是1的情况,输入2:循环数是4。例如:
      在这里插入图片描述
    • 数字运算:有多位数的可能,例如:100,所以判断是否>0,先得余,再得商
    class Solution {
        public boolean isHappy(int n) {
            Set<Integer> set=new HashSet<>();
            while(n!=1&&!set.contains(n)){
                set.add(n);
                n=getNum(n);
            } 
            return n==1;   
        }
    
        public int getNum(int n){
            int res=0;
            while(n>0){
                res+=(n%10)*(n%10);
                n=n/10;
            }
            System.out.println(res);
            return res;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    5. 两数之和 (1)
    • 题目链接: https://leetcode.cn/problems/two-sum/
    • 文章讲解/视频讲解:https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html
    class Solution {
        public int[] twoSum(int[] nums, int target) {
            Map<Integer,Integer> map=new HashMap<>();
            for(int i=0;i<nums.length;i++){
                int num=target-nums[i];
                if(!map.containsKey(num)){
                    map.put(nums[i],i);
                }else 
                    return new int[]{i,map.get(num)};
            }
            return new int[0];    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    javascript复习之旅 9.2初识到手写 javascript 中的 bind 函数
    Django笔记二十之手动编写migration文件
    thinkphp模型层Model、Logic与Service
    Flask 学习-39.Flask-RESTful 请求参数校验inputs
    Python连接MariaDB数据库
    同构和异构经典图神经网络汇总+pytorch代码
    重学设计模式(三、设计模式-解释器模式)
    【服务器数据恢复】5节点Lustre分布式文件系统RAID5数据恢复案例
    【java学习—九】面向对象内容总结(8)
    Linux | 工具使用(vim gcc g++ gdb yum git)
  • 原文地址:https://blog.csdn.net/qq_43563187/article/details/127997946