day 6 第三章 哈希表

87 阅读2分钟

题目

242.有效的字母异位词

数组哈希表的思想

定义一个数组叫做record用来上记录字符串s里字符出现的次数。
需要把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。
遍历 字符串s的时候,只需要将s.[i] - 'a' 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。

java小知识

  1. 数组长度用.length,String的长度用 .length()
  2. String取某个字符用.charAt(i)

349. 两个数组的交集

使用集合HashSet去重;

  1. 遍历数组1,用set1保存去重
  2. 遍历数组2,与set1相同元素存到resSet去重保存。
  3. 将resSet从集合转为数组的两种方法:
    1. 一行代码return resSet.stream().mapToInt(x -> x).toArray();
    2. 创建一个集合大小的数组,遍历resSet集合,给数组赋值。
        int[] res = new int[resSet.size()];
        int index = 0;
        for (int num : resSet) {
            res[index++] = num;
        }

202. 快乐数

注意到会无限循环,所以每次操作后得到的sum,只要重复,就false;
由此想到用HashSet存储,只要n不为1且不重复,就一直往里存,退出循环时只需判断是否n == 1

复习下基础操作取数值各个位上的单数

    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while(n != 1 && !set.contains(n)){
            set.add(n);
            n = getSum(n);
        }
        return n == 1;

    }

    public int getSum(int n){
        int sum = 0;
        while(n != 0){
            int x = n % 10;
            sum += x*x;
            n = n / 10;
        }
        return sum;
    }

1. 两数之和

关键是想到用Map。

本题其实有四个重点:

  1. 为什么会想到用哈希表
  2. 哈希表为什么用map
  3. 本题map是用来存什么的
  4. map中的key和value用来存什么的
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            int x = target - nums[i];
            if(map.containsKey(x)){
                return new int[] {map.get(x), i};
            }
            map.put(nums[i], i);
        }
        return new int[0];
    }

总结

  1. 集合选取 image.png

  2. 什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。