【专项刷题】— 哈希表

1、两数之和 - 力扣(LeetCode)

思路:

  1. 使用哈希表,将每次x = target  -  nums[i],查看哈希表中是否含有这个x值
  2. 代码:
    public int[] twoSum(int[] nums, int target) {
            int n = nums.length;
            Map<Integer,Integer> hash = new HashMap<>();
            for(int i = 0; i < n; i++){
                int x = target - nums[i];
                if(hash.containsKey(x)){
                    return new int[]{i, hash.get(x)};
                }
                //没有就继续添加到哈希表
                hash.put(nums[i],i);
            }
            //照顾编译器
            return new int[]{-1,-1};
        }

 2、判定是否互为字符重排 - 力扣(LeetCode)

思路:

  1. 先判断两个字符串的长度,长度不相等直接返回false
  2. 用一个数组表示的哈希表,先添加s1的字符,再遍历s2直接减去当前字符的值,然后再判断一下,如果出现小于零的数,就说明两个字符串有不相等的字符,返回false
  3. 代码:
    public boolean CheckPermutation(String s1, String s2) {
            if(s1.length() != s2.length()){
                return false;
            }
            int[] hash = new int[26];
            //将s1中的字符添加到哈希表中
            for(int i= 0; i < s1.length(); i++){
                hash[s1.charAt(i) - 'a']++;
            }
            //将s2添加到哈希表中,顺便减去相同字符的值,小于0就返回
            for(int i = 0; i < s2.length(); i++){
                hash[s2.charAt(i) - 'a']--;
                if(hash[s2.charAt(i) - 'a'] < 0){
                    return false;
                }
            }
            return true;
        }
    

 3、存在重复元素 II - 力扣(LeetCode)

思路:

  1. 将数据存储在哈希表中,遍历数组,遍历到一个数就在哈希表中查找是否有当前数
  2. 有的话就开始进行判断,没有的话就添加到哈希表
  3. 代码:
    public boolean containsNearbyDuplicate(int[] nums, int k) {
            int n = nums.length;
            Map<Integer,Integer> hash = new HashMap<>();
            for(int i = 0; i < n; i++){
                if(hash.containsKey(nums[i])){
                    int a = hash.get(nums[i]);
                    if(Math.abs(a - i) <= k){
                        return true;
                    }
                }
                hash.put(nums[i],i);
            }
            return false;
        }

 4、字母异位词分组 - 力扣(LeetCode)

思路:

  1. 首先将字符串数组里面的字符分组,然后将它们排序
  2. 然后遍历数组的时候判断一下key,创建一个key,这个可以都是已经排序好的了,检查哈希表中是否有这个key
  3. 有的话就就将原字符添加到顺序表中,没有的话就添加到哈希表中,创建顺序表
  4. 代码:
    public List<List<String>> groupAnagrams(String[] strs) {
            Map<String, List<String>> hash = new HashMap<>();
             
            //先给字符串数组分组,然后每组字符都排序
            for(String s : strs){
                char[] tmp = s.toCharArray();
                //排序
                Arrays.sort(tmp);
                //创建key,这里面的字符串都是已经排序的
                String key = new String(tmp);
    
                //判断
                if(! hash.containsKey(key)){
                    hash.put(key,new ArrayList());
                }
                //把原字符添加到数组中
                hash.get(key).add(s);
            }
            return new ArrayList(hash.values());
        }
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值