代码随想录Day5:哈希表

242.有效的字母异位词 leetcode地址

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] recode = new int[26];
        for(int i = 0; i < s.length();i++){
            recode[s.charAt(i) - 'a']++;
        }
        for(int i = 0; i < t.length();i++){
            recode[t.charAt(i) - 'a']--;
        }
        for(int c : recode){
            if(c != 0){
                return false;
            }
        }
        return true;
    }
}
class Solution {
    public boolean isAnagram(String s, String t) {
        int[] recode = new int[26];
        for(char si : s.toCharArray()){
            recode[si - 'a']++;
        }
        for(char ti : t.toCharArray()){
            recode[ti - 'a']--;
        }
        for(int c : recode){
            if(c != 0){
                return false;
            }
        }
        return true;
    }
}

两种for写法:区别在于返回char的方法。主要区别:

特性.toCharArray().charAt(int index)
返回类型char[]char
用途获取所有字符的数组获取特定位置的单个字符
适用场景需要遍历或修改多个字符时需要访问特定位置的字符时
        for(char si : s.toCharArray()){
            recode[si - 'a']++;
        }
        for(char ti : t.toCharArray()){
            recode[ti - 'a']--;
        }
        for(int c : recode){
            if(c != 0){
                return false;
            }
        }

第一次写这样形式 的for循环,以后多熟悉。

349. 两个数组的交集 leetcode地址

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();
        for(int num : nums1){
            set1.add(num);
        }
        for(int num : nums2){
            if(set1.contains(num)){
                set2.add(num);
            }
        }
        //方法一:set2转化为Array
        int[] arr = set2.stream().mapToInt(Integer::intValue).toArray();
        //方法二:建一个数组arr放入set2的内容
        int[] arr = new int[set2.size()];
        int j = 0;
        for(int i : set2){
            arr[j++] = i;
        }
        return arr;
    }
}

这个方法利用了 Set 中无重复元素的特性来确保结果中的元素唯一,并且实现简单高效。

其中在 Java 中,.contains() 方法用于检查集合中是否包含指定的元素。具体来说,.contains() 方法的行为取决于集合的类型(如 SetList 等)。

第一种set返回数组方法解释:
 

这行代码的作用是将一个 Set<Integer> 转换为一个 int[] 数组。以下是对这行代码的详细解释:

set2.stream().mapToInt(x -> x).toArray();
int[] arr = set2.stream().mapToInt(Integer::intValue).toArray();
  1. set2.stream()

    • 这部分代码将 set2(一个 Set<Integer>)转换为一个流(Stream)。流是 Java 8 引入的一种处理集合的方式,可以通过流来进行各种操作,如过滤、映射和收集等。
  2. mapToInt(Integer::intValue)

    • mapToInt 是一个中间操作,用于将流中的每个元素映射为一个 int 值。
    • Integer::intValue 是一个方法引用,表示对每个 Integer 对象调用 intValue() 方法,以获得其基本类型 int 的值。
    • 结果是一个 IntStream,它是专门用于处理基本类型 int 的流。
  3. toArray()

    • toArray() 是一个终止操作,用于将流中的元素收集到一个数组中。
    • 由于之前的操作生成的是 IntStream,调用 toArray() 会返回一个 int[] 类型的数组。

复习 运算符类型

  • &&(逻辑与)

    • 当且仅当两个操作数都为 true 时,结果才为 true;否则为 false
    • 短路操作符:如果第一个操作数为 false,则不会计算第二个操作数,因为结果已经确定为 false
  • ||(逻辑或)

    • 只要有一个操作数为 true,结果就为 true;只有当两个操作数都为 false 时,结果才为 false
    • 同样是短路操作符:如果第一个操作数为 true,则不会计算第二个操作数,因为结果已经确定为 true

 202. 快乐数 leetcode地址

 做这道题前需要先会写,取一个数值其各个位置上的单个数的方法。

        List<Integer> num = new ArrayList<>();
        
        // 处理负数
        number = 1234;
        
        while (number > 0) {
            int digit = number % 10; // 取出最后一位
            num.add(digit); // 添加到结果列表
            number /= 10; // 去掉最后一位
        }
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while(n != 1 && !set.contains(n)){
            set.add(n);
            n = getNextNumber(n);
        }
        return n == 1;
    }
    private int getNextNumber(int n){
        int res = 0;
        while(n > 0){
            int temp = n % 10;
            res += temp*temp;
            n = n / 10;
        } 
        return res;
    }  
}

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

1. 两数之和 leetcode地址 leetcode地址

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();

    for(int i = 0; i < nums.length; i++ ){
        int temp = target - nums[i];
        if (map.containsKey(temp)) {
            return new int[]{i,map.get(temp)};
        }else{
            map.put(nums[i],i);
        }
    }
    return null;
    }
}

在解决“两数之和”问题时,使用哈希表(Map)是因为它能够提供高效的查找和存储功能。以下是对你问题的详细解答:

1. 为什么会想到用哈希表

  • 快速查找:哈希表提供 O(1) 的平均时间复杂度来查找元素。在“两数之和”问题中,我们需要快速判断一个数是否已经存在,以便找到目标值。

  • 避免嵌套循环:如果使用数组遍历的方法(嵌套循环),时间复杂度为 O(n²),而使用哈希表可以将其降到 O(n),从而提高效率。

2. 哈希表为什么用 Map

  • 键值对存储Map 接口允许存储键值对,这使得我们可以将数字和其索引相关联。这样可以方便地查找和更新。

  • 灵活性和多种实现Map 提供了多种实现方式,如 HashMapTreeMap 等,开发者可以根据具体需求选择最合适的实现。

3. 本题中 map 是用来存什么的

  • 在“两数之和”问题中,map 用于存储数组中的数字及其对应的索引。这样可以在遍历数组时快速查找是否存在与当前数字配对的数字。

4. map 中的 key 和 value 用来存什么的

  • Key:在本题中,key 是数组中的数字。每个数字作为 key 存储在哈希表中。

  • Value:对应的 value 是该数字在数组中的索引。这使得我们可以在找到配对的数字时,快速返回它们的索引。

本节中的代码几乎都不熟练,都是连看带写的,周末注意复刷

算法3h

博客1h 

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值